home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / gawk / dist / awk.tab.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-10-24  |  89.7 KB  |  2,933 lines

  1.  
  2. /*  A Bison parser, made from awk.y  */
  3.  
  4. #define    FUNC_CALL    258
  5. #define    NAME    259
  6. #define    REGEXP    260
  7. #define    ERROR    261
  8. #define    NUMBER    262
  9. #define    YSTRING    263
  10. #define    RELOP    264
  11. #define    APPEND_OP    265
  12. #define    ASSIGNOP    266
  13. #define    MATCHOP    267
  14. #define    NEWLINE    268
  15. #define    CONCAT_OP    269
  16. #define    LEX_BEGIN    270
  17. #define    LEX_END    271
  18. #define    LEX_IF    272
  19. #define    LEX_ELSE    273
  20. #define    LEX_RETURN    274
  21. #define    LEX_DELETE    275
  22. #define    LEX_WHILE    276
  23. #define    LEX_DO    277
  24. #define    LEX_FOR    278
  25. #define    LEX_BREAK    279
  26. #define    LEX_CONTINUE    280
  27. #define    LEX_PRINT    281
  28. #define    LEX_PRINTF    282
  29. #define    LEX_NEXT    283
  30. #define    LEX_EXIT    284
  31. #define    LEX_FUNCTION    285
  32. #define    LEX_GETLINE    286
  33. #define    LEX_IN    287
  34. #define    LEX_AND    288
  35. #define    LEX_OR    289
  36. #define    INCREMENT    290
  37. #define    DECREMENT    291
  38. #define    LEX_BUILTIN    292
  39. #define    LEX_LENGTH    293
  40. #define    UNARY    294
  41.  
  42. #line 26 "awk.y"
  43.  
  44. #ifdef DEBUG
  45. #define YYDEBUG 12
  46. #endif
  47.  
  48. #include "awk.h"
  49.  
  50. /*
  51.  * This line is necessary since the Bison parser skeleton uses bcopy.
  52.  * Systems without memcpy should use -DMEMCPY_MISSING, per the Makefile.
  53.  * It should not hurt anything if Yacc is being used instead of Bison.
  54.  */
  55. #define bcopy(s,d,n)    memcpy((d),(s),(n))
  56.  
  57. extern void msg();
  58. extern struct re_pattern_buffer *mk_re_parse();
  59.  
  60. NODE *node();
  61. NODE *lookup();
  62. NODE *install();
  63.  
  64. static NODE *snode();
  65. static NODE *mkrangenode();
  66. static FILE *pathopen();
  67. static NODE *make_for_loop();
  68. static NODE *append_right();
  69. static void func_install();
  70. static NODE *make_param();
  71. static int hashf();
  72. static void pop_params();
  73. static void pop_var();
  74. static int yylex ();
  75. static void yyerror();
  76.  
  77. static int want_regexp;        /* lexical scanning kludge */
  78. static int want_assign;        /* lexical scanning kludge */
  79. static int can_return;        /* lexical scanning kludge */
  80. static int io_allowed = 1;    /* lexical scanning kludge */
  81. static int lineno = 1;        /* for error msgs */
  82. static char *lexptr;        /* pointer to next char during parsing */
  83. static char *lexptr_begin;    /* keep track of where we were for error msgs */
  84. static int curinfile = -1;    /* index into sourcefiles[] */
  85. static int param_counter;
  86.  
  87. NODE *variables[HASHSIZE];
  88.  
  89. extern int errcount;
  90. extern NODE *begin_block;
  91. extern NODE *end_block;
  92.  
  93. #line 77 "awk.y"
  94. typedef union {
  95.     long lval;
  96.     AWKNUM fval;
  97.     NODE *nodeval;
  98.     NODETYPE nodetypeval;
  99.     char *sval;
  100.     NODE *(*ptrval)();
  101. } YYSTYPE;
  102.  
  103. #ifndef YYLTYPE
  104. typedef
  105.   struct yyltype
  106.     {
  107.       int timestamp;
  108.       int first_line;
  109.       int first_column;
  110.       int last_line;
  111.       int last_column;
  112.       char *text;
  113.    }
  114.   yyltype;
  115.  
  116. #define YYLTYPE yyltype
  117. #endif
  118.  
  119. #define    YYACCEPT    return(0)
  120. #define    YYABORT    return(1)
  121. #define    YYERROR    goto yyerrlab
  122. #include <stdio.h>
  123.  
  124. #ifndef __STDC__
  125. #define const
  126. #endif
  127.  
  128.  
  129.  
  130. #define    YYFINAL        298
  131. #define    YYFLAG        -32768
  132. #define    YYNTBASE    61
  133.  
  134. #define YYTRANSLATE(x) ((unsigned)(x) <= 294 ? yytranslate[x] : 105)
  135.  
  136. static const char yytranslate[] = {     0,
  137.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  138.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  139.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  140.      2,     2,    49,     2,     2,    52,    48,     2,     2,    53,
  141.     54,    46,    44,    60,    45,     2,    47,     2,     2,     2,
  142.      2,     2,     2,     2,     2,     2,     2,    40,    59,    41,
  143.      2,    42,    39,     2,     2,     2,     2,     2,     2,     2,
  144.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  145.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  146.     55,     2,    56,    51,     2,     2,     2,     2,     2,     2,
  147.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  148.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  149.      2,     2,    57,    43,    58,     2,     2,     2,     2,     2,
  150.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  151.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  152.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  153.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  154.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  155.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  156.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  157.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  158.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  159.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  160.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  161.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  162.      2,     2,     2,     2,     2,     1,     2,     3,     4,     5,
  163.      6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
  164.     16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
  165.     26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
  166.     36,    37,    38,    50
  167. };
  168.  
  169. static const short yyrline[] = {     0,
  170.    136,   141,   149,   165,   166,   170,   172,   186,   188,   202,
  171.    208,   214,   216,   218,   220,   229,   231,   236,   240,   248,
  172.    257,   259,   268,   270,   281,   286,   291,   293,   301,   303,
  173.    308,   310,   316,   318,   320,   322,   324,   326,   328,   333,
  174.    337,   342,   345,   348,   350,   352,   355,   356,   358,   360,
  175.    362,   364,   369,   371,   376,   381,   388,   390,   395,   397,
  176.    402,   404,   409,   411,   413,   415,   420,   422,   427,   429,
  177.    431,   433,   435,   441,   443,   448,   450,   455,   457,   463,
  178.    465,   467,   469,   474,   476,   481,   483,   489,   491,   493,
  179.    495,   500,   503,   504,   506,   511,   520,   522,   524,   526,
  180.    528,   530,   532,   534,   536,   538,   540,   542,   547,   550,
  181.    551,   553,   555,   564,   566,   568,   570,   572,   574,   576,
  182.    578,   583,   585,   587,   589,   591,   593,   597,   599,   601,
  183.    603,   605,   607,   609,   613,   615,   617,   619,   621,   623,
  184.    625,   627,   632,   634,   639,   641,   643,   648,   652,   656,
  185.    660,   661,   665,   668
  186. };
  187.  
  188. static const char * const yytname[] = {     0,
  189. "error","$illegal.","FUNC_CALL","NAME","REGEXP","ERROR","NUMBER","YSTRING","RELOP","APPEND_OP",
  190. "ASSIGNOP","MATCHOP","NEWLINE","CONCAT_OP","LEX_BEGIN","LEX_END","LEX_IF","LEX_ELSE","LEX_RETURN","LEX_DELETE",
  191. "LEX_WHILE","LEX_DO","LEX_FOR","LEX_BREAK","LEX_CONTINUE","LEX_PRINT","LEX_PRINTF","LEX_NEXT","LEX_EXIT","LEX_FUNCTION",
  192. "LEX_GETLINE","LEX_IN","LEX_AND","LEX_OR","INCREMENT","DECREMENT","LEX_BUILTIN","LEX_LENGTH","'?'","':'",
  193. "'<'","'>'","'|'","'+'","'-'","'*'","'/'","'%'","'!'","UNARY",
  194. "'^'","'$'","'('","')'","'['","']'","'{'","'}'","';'","','",
  195. "start"
  196. };
  197.  
  198. static const short yyr1[] = {     0,
  199.     61,    62,    62,    62,    62,    64,    63,    65,    63,    63,
  200.     63,    63,    63,    63,    63,    66,    66,    68,    67,    69,
  201.     70,    70,    72,    71,    73,    73,    74,    74,    74,    74,
  202.     75,    75,    76,    76,    76,    76,    76,    76,    76,    76,
  203.     76,    76,    76,    76,    76,    77,    76,    76,    78,    76,
  204.     76,    76,    79,    79,    80,    80,    81,    81,    82,    82,
  205.     83,    83,    84,    84,    84,    84,    85,    85,    86,    86,
  206.     86,    86,    86,    87,    87,    88,    88,    89,    89,    89,
  207.     89,    89,    89,    90,    90,    91,    91,    91,    91,    91,
  208.     91,    93,    92,    92,    92,    92,    92,    92,    92,    92,
  209.     92,    92,    92,    92,    92,    92,    92,    92,    95,    94,
  210.     94,    94,    94,    94,    94,    94,    94,    94,    94,    94,
  211.     94,    96,    96,    96,    96,    96,    96,    96,    96,    96,
  212.     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
  213.     96,    96,    97,    97,    98,    98,    98,    99,   100,   101,
  214.    102,   102,   103,   104
  215. };
  216.  
  217. static const short yyr2[] = {     0,
  218.      3,     1,     2,     1,     2,     0,     3,     0,     3,     2,
  219.      2,     2,     1,     2,     2,     1,     1,     0,     7,     3,
  220.      1,     3,     0,     4,     3,     4,     1,     2,     1,     2,
  221.      1,     2,     2,     2,     3,     1,     6,     8,     8,    10,
  222.      9,     2,     2,     6,     4,     0,     3,     3,     0,     4,
  223.      6,     2,     1,     1,     6,     9,     1,     2,     0,     1,
  224.      0,     2,     0,     2,     2,     2,     0,     1,     1,     3,
  225.      1,     2,     3,     0,     1,     0,     1,     1,     3,     1,
  226.      2,     3,     3,     0,     1,     1,     3,     1,     2,     3,
  227.      3,     0,     4,     5,     4,     3,     3,     3,     3,     1,
  228.      2,     3,     3,     3,     3,     5,     1,     2,     0,     4,
  229.      3,     3,     3,     1,     2,     3,     3,     3,     5,     1,
  230.      2,     2,     3,     4,     4,     1,     4,     2,     2,     2,
  231.      2,     1,     1,     1,     3,     3,     3,     3,     3,     3,
  232.      2,     2,     0,     1,     1,     4,     2,     2,     2,     1,
  233.      0,     1,     1,     2
  234. };
  235.  
  236. static const short yydefact[] = {    59,
  237.     57,    60,     0,    58,     4,     0,   145,   133,   134,     6,
  238.      8,    18,   143,     0,     0,     0,   126,     0,     0,    23,
  239.      0,     0,     0,    59,     0,     2,     0,     0,   100,    13,
  240.     21,   107,   132,     0,     0,     0,   153,     0,    10,    31,
  241.     59,     0,    11,     0,    61,   144,   128,   129,     0,     0,
  242.      0,     0,   142,   132,   141,     0,   101,   122,   147,    88,
  243.      0,    86,   148,     5,     3,     1,    15,     0,    12,    14,
  244.      0,     0,     0,     0,     0,     0,     0,     0,     0,    59,
  245.    108,     0,     0,     0,     0,     0,     0,     0,    92,   130,
  246.    131,    29,     0,    49,     0,     0,    59,     0,     0,     0,
  247.     53,    54,    46,    74,    59,     0,    27,     0,    36,     0,
  248.      0,   151,    59,     0,     0,    86,     0,     7,    32,     9,
  249.     17,    16,     0,     0,    96,     0,     0,     0,     0,    89,
  250.    150,     0,     0,   123,     0,   103,    99,   102,    97,    98,
  251.      0,   104,   105,   143,   154,    22,   139,   140,   136,   137,
  252.    138,   135,     0,     0,    74,     0,     0,     0,    74,    42,
  253.     43,     0,     0,    75,   149,    30,    28,   151,    80,   143,
  254.      0,     0,   114,    63,     0,    78,   120,   132,    52,     0,
  255.     34,    25,   152,    33,   127,   146,     0,    62,   124,   125,
  256.     24,    90,     0,    91,    87,    20,     0,    95,    93,     0,
  257.      0,     0,     0,     0,   145,     0,    47,    48,    26,    61,
  258.    115,     0,     0,     0,     0,     0,    81,     0,     0,     0,
  259.      0,     0,     0,     0,   121,   109,    35,    71,    69,     0,
  260.      0,    94,   106,    59,    50,     0,    59,     0,     0,     0,
  261.    113,    63,    65,    64,    66,    45,    82,    83,    79,   118,
  262.    116,   117,   111,   112,     0,     0,    59,    72,     0,     0,
  263.      0,     0,     0,     0,     0,    74,     0,     0,   110,    19,
  264.     73,    70,    55,    51,    37,     0,    59,    74,     0,    44,
  265.    119,    59,    59,     0,     0,    59,     0,    38,    39,    59,
  266.      0,    56,     0,    41,    40,     0,     0,     0
  267. };
  268.  
  269. static const short yydefgoto[] = {   296,
  270.     25,    26,    38,    42,   123,    27,    44,    67,    28,    29,
  271.     56,    30,   106,    39,   107,   162,   155,   108,   109,     2,
  272.      3,   125,   216,   230,   231,   163,   174,   175,   114,   115,
  273.     81,   153,   225,   256,    32,    45,    33,   111,   112,   134,
  274.    182,   113,   133
  275. };
  276.  
  277. static const short yypact[] = {    21,
  278. -32768,    37,  1020,-32768,-32768,   -32,     1,-32768,-32768,    17,
  279.     17,-32768,    11,    11,    11,    31,    45,  1757,  1757,-32768,
  280.   1738,  1757,  1112,    21,   540,-32768,    13,    40,-32768,-32768,
  281.    816,   142,    55,   612,  1092,  1112,-32768,    13,-32768,    37,
  282.     21,    13,-32768,    51,    59,-32768,-32768,-32768,  1092,  1092,
  283.   1757,  1625,    27,    -7,    27,    97,-32768,    27,-32768,-32768,
  284.      4,  1225,-32768,-32768,-32768,-32768,-32768,   706,-32768,-32768,
  285.   1625,  1625,   100,  1625,  1625,  1625,  1625,  1625,    76,    21,
  286.    300,  1625,  1757,  1757,  1757,  1757,  1757,  1757,-32768,-32768,
  287. -32768,-32768,    52,-32768,   109,    62,    21,    64,    17,    17,
  288. -32768,-32768,-32768,  1625,    21,   659,-32768,   763,-32768,   920,
  289.    612,    65,    21,    67,     7,  1324,    25,-32768,-32768,-32768,
  290. -32768,-32768,    70,  1757,-32768,    67,    67,  1225,    84,  1625,
  291. -32768,   101,  1159,-32768,   659,  1811,  1796,-32768,  1465,  1371,
  292.   1277,  1811,  1811,    11,-32768,  1324,   -10,   -10,    27,    27,
  293.     27,    27,  1625,  1625,  1625,    87,  1625,   863,  1672,-32768,
  294. -32768,    17,    17,  1324,-32768,-32768,-32768,    65,-32768,    11,
  295.   1738,  1112,-32768,     9,     0,  1512,   142,    83,-32768,   659,
  296. -32768,-32768,-32768,-32768,-32768,-32768,     8,   142,-32768,-32768,
  297. -32768,  1324,   134,-32768,  1324,-32768,  1625,-32768,  1324,  1225,
  298.     17,  1112,  1225,   122,   -16,    65,-32768,-32768,-32768,    59,
  299. -32768,     4,  1625,  1625,  1625,    17,  1691,  1178,  1691,  1691,
  300.    140,  1691,  1691,  1691,   939,-32768,-32768,-32768,-32768,    67,
  301.     23,-32768,  1324,    21,-32768,    26,    21,    94,   144,  1045,
  302. -32768,     9,  1324,  1324,  1324,-32768,  1512,-32768,  1512,   782,
  303.   1858,-32768,  1606,  1559,  1418,  1691,    21,-32768,    44,   863,
  304.     17,   863,  1625,    67,   973,  1625,    17,  1691,  1512,-32768,
  305. -32768,-32768,   131,-32768,-32768,  1225,    21,  1625,    67,-32768,
  306.   1512,    21,    21,   863,    67,    21,   863,-32768,-32768,    21,
  307.    863,-32768,   863,-32768,-32768,   163,   166,-32768
  308. };
  309.  
  310. static const short yypgoto[] = {-32768,
  311. -32768,   145,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   201,
  312. -32768,    78,   -54,    12,   225,-32768,-32768,-32768,-32768,   363,
  313.    104,   -39,   -70,-32768,-32768,  -152,-32768,-32768,    60,   -19,
  314.     -3,-32768,   -83,-32768,   146,  -126,    74,   178,  -100,   319,
  315.     10,   329,   -29
  316. };
  317.  
  318.  
  319. #define    YYLAST        1911
  320.  
  321.  
  322. static const short yytable[] = {    31,
  323.    217,    82,   201,    61,   130,   168,   206,   130,   228,   -77,
  324.    181,   229,   -77,   135,     7,   239,   117,   198,   213,    62,
  325.     35,    31,    43,   258,   176,   130,   130,    90,    91,     1,
  326.    110,   116,   116,     1,   196,    85,    86,    87,    36,    70,
  327.     88,   -77,   -77,   210,   271,   116,   116,   272,   128,     4,
  328.    214,   215,     1,   121,   122,    36,   180,   131,   -77,    80,
  329.    -85,   -67,    22,    80,   110,    89,    80,   136,   137,    24,
  330.    139,   140,   141,   142,   143,    37,   -68,    88,   146,   227,
  331.    186,   261,    80,    49,    80,    80,    46,    47,    48,    90,
  332.     91,    54,    54,   226,    54,    54,    24,    50,    37,   124,
  333.    164,   129,   110,   138,   154,    69,   144,   110,   126,   127,
  334.    160,   161,   156,   279,   157,   118,   159,    90,    91,   120,
  335.    131,   179,   187,    37,    54,   285,   192,    63,    66,   195,
  336.    191,   110,   193,   247,   249,   250,   251,   232,   253,   254,
  337.    255,   202,   238,   252,   119,   218,   263,   264,   282,   199,
  338.    200,   164,   212,   203,   110,   164,    54,    54,    54,    54,
  339.     54,    54,   297,    53,    55,   298,    58,    59,    62,    65,
  340.    241,   267,   269,   207,   208,     0,   110,   209,     0,     0,
  341.     34,   178,   236,   145,   281,    83,    84,    85,    86,    87,
  342.      0,     0,    88,   233,     0,     0,    58,    54,   116,     0,
  343.    158,   259,    34,     0,    68,    34,     0,     0,   165,   243,
  344.    244,   245,   235,     0,     0,    34,   184,    46,     0,    34,
  345.      0,    57,     0,     0,     0,     0,     0,   246,   147,   148,
  346.    149,   150,   151,   152,     0,     0,   265,     0,     0,     0,
  347.      0,     0,     0,    46,    54,     0,     0,     0,     0,   178,
  348.      0,     0,     0,   177,     0,     0,   110,     0,   110,   276,
  349.      0,     0,   164,     0,     0,     0,     0,     0,     0,   188,
  350.      0,     0,   274,     0,   164,     0,     0,     0,   280,     0,
  351.    110,     0,     0,   110,     0,     0,     0,   110,     0,   110,
  352.    178,   178,   178,   178,     0,   178,   178,   178,   178,     0,
  353.      0,     0,     0,     7,     0,     0,     8,     9,   173,     0,
  354.      0,     0,     0,     0,     0,     0,    58,     0,     0,     0,
  355.    178,   177,   178,   178,   178,     0,   178,   178,   178,   178,
  356.    167,     0,     0,     0,    14,    15,     0,   260,    41,    41,
  357.    262,   178,   178,    18,    19,     0,    20,     0,    21,     0,
  358.      0,    22,    23,     0,   178,     0,    41,     0,     0,   167,
  359.    270,     0,   177,   177,   177,   177,     0,   177,   177,   177,
  360.    177,   211,    40,    40,     0,     0,   173,     0,     0,   132,
  361.    284,     0,   204,     0,     0,   287,   288,     0,     0,   291,
  362.     40,     0,   177,   293,   177,   177,   177,     0,   177,   177,
  363.    177,   177,     0,     0,   167,     0,     0,     0,     0,     0,
  364.      0,     0,     0,   177,   177,     0,     0,   173,   173,   173,
  365.    173,     0,   173,   173,   173,   173,   177,    41,    41,     0,
  366.      0,     0,   185,     0,     0,     0,     0,     0,    41,     0,
  367.    183,     0,     0,     0,   189,   190,     0,   173,     0,   173,
  368.    173,   173,     0,   173,   173,   173,   173,     0,     0,     0,
  369.      0,    40,    40,     0,     0,     0,     0,     0,   173,   173,
  370.      0,     0,    40,     0,     0,     0,     0,     0,     0,     0,
  371.      0,   173,     0,     0,   273,     0,   275,     0,     0,     0,
  372.     41,    41,     0,     0,     0,     0,   183,     0,     0,     0,
  373.      0,     0,     0,     0,     0,     0,     0,     0,   289,     0,
  374.      0,   292,     0,     0,     0,   294,     0,   295,   234,     0,
  375.      0,   237,     0,     0,    40,    40,     0,     0,     0,    41,
  376.    242,     0,     0,     0,   240,     0,     0,     0,     0,   -59,
  377.     64,     0,     6,     7,    41,     0,     8,     9,   257,     0,
  378.      0,     0,     1,     0,    10,    11,     0,     0,     0,     0,
  379.      0,     0,     0,    40,     0,     0,     0,     0,   266,    12,
  380.     13,     0,     0,     0,    14,    15,    16,    17,    40,     0,
  381.      0,     0,   277,    18,    19,     0,    20,     0,    21,    41,
  382.      0,    22,    23,   278,   283,    41,    24,   286,     0,     0,
  383.      0,     0,     0,   290,     0,     0,     0,     0,     0,     0,
  384.      0,     0,    92,     0,     6,     7,     0,     0,     8,     9,
  385.      0,     0,     0,    40,     0,     0,     0,     0,    93,    40,
  386.     94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
  387.    104,     0,    13,     0,     0,     0,    14,    15,    16,    17,
  388.      0,     0,     0,     0,     0,    18,    19,     0,    20,   166,
  389.     21,     6,     7,    22,    23,     8,     9,     0,    24,   105,
  390.     37,     0,     0,     0,     0,    93,     0,    94,    95,    96,
  391.     97,    98,    99,   100,   101,   102,   103,   104,     0,    13,
  392.      0,     0,     0,    14,    15,    16,    17,     0,     0,     0,
  393.      0,     0,    18,    19,     0,    20,    92,    21,     6,     7,
  394.     22,    23,     8,     9,     0,    24,   105,    37,     0,     0,
  395.      0,     0,    93,     0,    94,    95,    96,    97,    98,    99,
  396.    100,   101,   102,   103,   104,     0,    13,     0,     0,     0,
  397.     14,    15,    16,    17,     0,     0,     0,     0,     0,    18,
  398.     19,     0,    20,     0,    21,     0,     0,    22,    23,     0,
  399.      0,     0,    24,   169,    37,     6,     7,     0,     0,     8,
  400.      9,     0,   -76,     0,     0,   -76,     0,     0,     0,     0,
  401.      0,     0,     0,     0,     0,     7,     0,     0,     8,     9,
  402. -32768,     0,     0,   170,     0,     0,     0,    14,    15,    16,
  403.     17,     0,     0,     0,   -76,   -76,    18,    19,     0,    20,
  404.      0,   171,     0,     0,    22,   172,    14,    15,     6,     7,
  405.      0,   -76,     8,     9,    71,    18,    19,    72,    20,     0,
  406.    171,     0,     0,    22,    52,     0,     0,     0,     0,     0,
  407.      0,     0,     0,     0,     0,     0,    13,    73,    74,    75,
  408.     14,    15,    16,    17,    76,     0,    77,    78,    79,    18,
  409.     19,     0,    20,     0,    21,     6,     7,    22,    23,     8,
  410.      9,     0,     0,     0,     0,    80,     0,     0,     0,    93,
  411.      0,    94,    95,    96,    97,    98,    99,   100,   101,   102,
  412.    103,   104,     0,    13,     0,     0,     0,    14,    15,    16,
  413.     17,     0,     0,     0,     0,     0,    18,    19,     0,    20,
  414.      0,    21,     0,     0,    22,    23,     0,     0,     0,    24,
  415.      0,    37,     6,     7,     0,     0,     8,     9,    71,     0,
  416.      0,    72,     1,     0,     0,     0,     0,     0,     0,     0,
  417.      0,     0,     7,     0,     0,     8,     9,     0,     0,     0,
  418.     13,    73,    74,    75,    14,    15,    16,    17,    76,     0,
  419.     77,    78,    79,    18,    19,     0,    20,     0,    21,     0,
  420.      0,    22,    23,    14,    15,     6,     7,     0,    37,     8,
  421.      9,    71,    18,    19,    72,    20,     0,   171,     0,     0,
  422.     22,    52,     0,     0,     0,     0,     0,     0,     0,     0,
  423.      0,     0,     0,    13,    73,    74,    75,    14,    15,    16,
  424.     17,    76,     0,    77,    78,    79,    18,    19,     0,    20,
  425.      5,    21,     6,     7,    22,    23,     8,     9,     0,     0,
  426.      0,    37,     0,     0,    10,    11,     0,     0,     0,     0,
  427.      0,     0,     0,     0,     0,     0,     0,     6,     7,    12,
  428.     13,     8,     9,     0,    14,    15,    16,    17,     0,     0,
  429.      0,     0,     0,    18,    19,     0,    20,     0,    21,     0,
  430.      0,    22,    23,     0,     0,    13,    24,     0,     0,    14,
  431.     15,    16,    17,     0,     0,     0,     0,     0,    18,    19,
  432.      0,    20,    60,    21,     6,     7,    22,    23,     8,     9,
  433.      0,     0,     0,    37,     0,     0,     0,     0,     0,     0,
  434.      0,     0,    60,     0,     6,     7,     0,     0,     8,     9,
  435.      0,     0,    13,     0,     0,     0,    14,    15,    16,    17,
  436.      0,     0,     0,     0,     0,    18,    19,     0,    20,     0,
  437.     21,     0,    13,    22,    23,   -84,    14,    15,    16,    17,
  438.      0,     0,     0,     0,     0,    18,    19,     0,    20,   194,
  439.     21,     6,     7,    22,    23,     8,     9,     0,     0,     0,
  440.      0,     0,     0,     0,     0,     0,     0,     0,   248,     0,
  441.      6,     7,     0,     0,     8,     9,     0,     0,     0,    13,
  442.      0,     0,     0,    14,    15,    16,    17,     0,     0,     0,
  443.      0,     0,    18,    19,     0,    20,     0,    21,   170,     0,
  444.     22,    23,    14,    15,    16,    17,     0,     0,     0,     0,
  445.      0,    18,    19,     0,    20,     0,   171,     6,     7,    22,
  446.     52,     8,     9,    71,     0,     0,    72,     0,     0,     0,
  447.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  448.      0,     0,     0,     0,     0,    13,    73,    74,    75,    14,
  449.     15,    16,    17,    76,     0,    77,    78,    79,    18,    19,
  450.      0,    20,     0,    21,     0,     0,    22,    23,   131,     6,
  451.      7,     0,     0,     8,     9,    71,     0,     0,    72,     0,
  452.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  453.      0,     0,     0,     0,     0,     0,     0,    13,    73,    74,
  454.     75,    14,    15,    16,    17,    76,   197,    77,    78,    79,
  455.     18,    19,     0,    20,     0,    21,     6,     7,    22,    23,
  456.      8,     9,    71,     0,     0,    72,     0,     0,     0,     0,
  457.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  458.      0,     0,     0,     0,    13,    73,    74,    75,    14,    15,
  459.     16,    17,    76,     0,    77,    78,    79,    18,    19,     0,
  460.     20,     0,    21,     6,     7,    22,    23,     8,     9,    71,
  461.      0,     0,    72,     0,     0,     0,     0,     0,     0,     0,
  462.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  463.      0,    13,    73,    74,     0,    14,    15,    16,    17,     0,
  464.      0,    77,    78,    79,    18,    19,     0,    20,     0,    21,
  465.      6,     7,    22,    23,     8,     9,   219,     0,     0,   220,
  466.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  467.      0,     0,     0,     0,     0,     0,     0,     0,   170,   221,
  468.    222,   223,    14,    15,    16,    17,   224,   268,     0,     0,
  469.      0,    18,    19,     0,    20,     0,   171,     6,     7,    22,
  470.     52,     8,     9,    71,     0,     0,    72,     0,     0,     0,
  471.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  472.      0,     0,     0,     0,     0,    13,    73,     0,     0,    14,
  473.     15,    16,    17,     0,     0,    77,    78,    79,    18,    19,
  474.      0,    20,     0,    21,     6,     7,    22,    23,     8,     9,
  475.    219,     0,     0,   220,     0,     0,     0,     0,     0,     0,
  476.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  477.      0,     0,   170,   221,   222,   223,    14,    15,    16,    17,
  478.    224,     0,     0,     0,     0,    18,    19,     0,    20,     0,
  479.    171,     6,     7,    22,    52,     8,     9,   219,     0,     0,
  480.    220,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  481.      0,     0,     0,     0,     0,     0,     0,     0,     0,   170,
  482.    221,   222,     0,    14,    15,    16,    17,     0,     0,     0,
  483.      0,     0,    18,    19,     0,    20,     0,   171,     6,     7,
  484.     22,    52,     8,     9,   219,     0,     0,   220,     0,     0,
  485.      0,     0,     0,     0,     0,     0,     0,     6,     7,     0,
  486.      0,     8,     9,     0,     0,     0,   170,   221,     0,     0,
  487.     14,    15,    16,    17,     0,     0,     0,     0,     0,    18,
  488.     19,     0,    20,     0,   171,    13,     0,    22,    52,    14,
  489.     15,    16,    17,     0,     0,     0,     0,     0,    18,    19,
  490.      0,    20,     0,    21,     6,   205,    22,    23,     8,     9,
  491.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  492.      0,     0,     0,     6,     7,     0,     0,     8,     9,     0,
  493.      0,     0,    13,     0,     0,     0,    14,    15,    16,    17,
  494.      0,     0,     0,     0,     0,    18,    19,     0,    20,     0,
  495.     21,   170,     0,    22,    23,    14,    15,    16,    17,     0,
  496.      0,     0,     0,     0,    18,    19,     0,    20,     0,   171,
  497.      6,     7,    22,    52,     8,     9,     0,     0,     0,     0,
  498.      0,     0,     0,     0,     0,     0,     0,     0,     0,     6,
  499.      7,     0,     0,     8,     9,     0,     0,     0,     0,     0,
  500.      0,     0,    14,    15,    16,    17,     0,     0,     0,     0,
  501.      0,    18,    19,     0,    20,     0,    51,     0,     0,    22,
  502.     52,    14,    15,    16,    17,     0,     0,     0,     0,     7,
  503.     18,    19,     8,     9,    71,    51,     0,-32768,    22,    52,
  504.      0,     0,     0,     0,     7,     0,     0,     8,     9,-32768,
  505.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  506.     14,    15,     0,     0,     0,     0,    77,    78,    79,    18,
  507.     19,     0,    20,     0,    21,    14,    15,    22,    23,     0,
  508.      0,-32768,-32768,-32768,    18,    19,     0,    20,     0,    21,
  509.      0,     7,    22,    23,     8,     9,   219,     0,     0,-32768,
  510.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  511.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  512.      0,     0,    14,    15,     0,     0,     0,     0,     0,     0,
  513.      0,    18,    19,     0,    20,     0,   171,     0,     0,    22,
  514.     52
  515. };
  516.  
  517. static const short yycheck[] = {     3,
  518.      1,    31,   155,    23,     1,   106,   159,     1,     1,    10,
  519.    111,     4,    13,    68,     4,    32,    36,   144,    10,    23,
  520.     53,    25,    11,     1,   108,     1,     1,    35,    36,    13,
  521.     34,    35,    36,    13,   135,    46,    47,    48,    55,    28,
  522.     51,    42,    43,   170,     1,    49,    50,     4,    52,    13,
  523.     42,    43,    13,     3,     4,    55,   111,    54,    59,    60,
  524.     54,    54,    52,    60,    68,    11,    60,    71,    72,    57,
  525.     74,    75,    76,    77,    78,    59,    54,    51,    82,   180,
  526.     56,    56,    60,    53,    60,    60,    13,    14,    15,    35,
  527.     36,    18,    19,    11,    21,    22,    57,    53,    59,    41,
  528.    104,     5,   106,     4,    53,    28,    31,   111,    49,    50,
  529.     99,   100,     4,   266,    53,    38,    53,    35,    36,    42,
  530.     54,   110,    53,    59,    51,   278,   130,    24,    25,   133,
  531.     47,   135,    32,   217,   218,   219,   220,     4,   222,   223,
  532.    224,    55,    21,     4,    41,   175,    53,     4,    18,   153,
  533.    154,   155,   172,   157,   158,   159,    83,    84,    85,    86,
  534.     87,    88,     0,    18,    19,     0,    21,    22,   172,    25,
  535.    210,   242,   256,   162,   163,    -1,   180,   168,    -1,    -1,
  536.      3,   108,   202,    80,   268,    44,    45,    46,    47,    48,
  537.     -1,    -1,    51,   197,    -1,    -1,    51,   124,   202,    -1,
  538.     97,   231,    25,    -1,    27,    28,    -1,    -1,   105,   213,
  539.    214,   215,   201,    -1,    -1,    38,   113,   144,    -1,    42,
  540.     -1,    21,    -1,    -1,    -1,    -1,    -1,   216,    83,    84,
  541.     85,    86,    87,    88,    -1,    -1,   240,    -1,    -1,    -1,
  542.     -1,    -1,    -1,   170,   171,    -1,    -1,    -1,    -1,   176,
  543.     -1,    -1,    -1,   108,    -1,    -1,   260,    -1,   262,   263,
  544.     -1,    -1,   266,    -1,    -1,    -1,    -1,    -1,    -1,   124,
  545.     -1,    -1,   261,    -1,   278,    -1,    -1,    -1,   267,    -1,
  546.    284,    -1,    -1,   287,    -1,    -1,    -1,   291,    -1,   293,
  547.    217,   218,   219,   220,    -1,   222,   223,   224,   225,    -1,
  548.     -1,    -1,    -1,     4,    -1,    -1,     7,     8,   108,    -1,
  549.     -1,    -1,    -1,    -1,    -1,    -1,   171,    -1,    -1,    -1,
  550.    247,   176,   249,   250,   251,    -1,   253,   254,   255,   256,
  551.    106,    -1,    -1,    -1,    35,    36,    -1,   234,    10,    11,
  552.    237,   268,   269,    44,    45,    -1,    47,    -1,    49,    -1,
  553.     -1,    52,    53,    -1,   281,    -1,    28,    -1,    -1,   135,
  554.    257,    -1,   217,   218,   219,   220,    -1,   222,   223,   224,
  555.    225,   171,    10,    11,    -1,    -1,   176,    -1,    -1,    61,
  556.    277,    -1,   158,    -1,    -1,   282,   283,    -1,    -1,   286,
  557.     28,    -1,   247,   290,   249,   250,   251,    -1,   253,   254,
  558.    255,   256,    -1,    -1,   180,    -1,    -1,    -1,    -1,    -1,
  559.     -1,    -1,    -1,   268,   269,    -1,    -1,   217,   218,   219,
  560.    220,    -1,   222,   223,   224,   225,   281,    99,   100,    -1,
  561.     -1,    -1,   114,    -1,    -1,    -1,    -1,    -1,   110,    -1,
  562.    112,    -1,    -1,    -1,   126,   127,    -1,   247,    -1,   249,
  563.    250,   251,    -1,   253,   254,   255,   256,    -1,    -1,    -1,
  564.     -1,    99,   100,    -1,    -1,    -1,    -1,    -1,   268,   269,
  565.     -1,    -1,   110,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  566.     -1,   281,    -1,    -1,   260,    -1,   262,    -1,    -1,    -1,
  567.    162,   163,    -1,    -1,    -1,    -1,   168,    -1,    -1,    -1,
  568.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   284,    -1,
  569.     -1,   287,    -1,    -1,    -1,   291,    -1,   293,   200,    -1,
  570.     -1,   203,    -1,    -1,   162,   163,    -1,    -1,    -1,   201,
  571.    212,    -1,    -1,    -1,   206,    -1,    -1,    -1,    -1,     0,
  572.      1,    -1,     3,     4,   216,    -1,     7,     8,   230,    -1,
  573.     -1,    -1,    13,    -1,    15,    16,    -1,    -1,    -1,    -1,
  574.     -1,    -1,    -1,   201,    -1,    -1,    -1,    -1,   240,    30,
  575.     31,    -1,    -1,    -1,    35,    36,    37,    38,   216,    -1,
  576.     -1,    -1,   264,    44,    45,    -1,    47,    -1,    49,   261,
  577.     -1,    52,    53,   265,   276,   267,    57,   279,    -1,    -1,
  578.     -1,    -1,    -1,   285,    -1,    -1,    -1,    -1,    -1,    -1,
  579.     -1,    -1,     1,    -1,     3,     4,    -1,    -1,     7,     8,
  580.     -1,    -1,    -1,   261,    -1,    -1,    -1,    -1,    17,   267,
  581.     19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
  582.     29,    -1,    31,    -1,    -1,    -1,    35,    36,    37,    38,
  583.     -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,     1,
  584.     49,     3,     4,    52,    53,     7,     8,    -1,    57,    58,
  585.     59,    -1,    -1,    -1,    -1,    17,    -1,    19,    20,    21,
  586.     22,    23,    24,    25,    26,    27,    28,    29,    -1,    31,
  587.     -1,    -1,    -1,    35,    36,    37,    38,    -1,    -1,    -1,
  588.     -1,    -1,    44,    45,    -1,    47,     1,    49,     3,     4,
  589.     52,    53,     7,     8,    -1,    57,    58,    59,    -1,    -1,
  590.     -1,    -1,    17,    -1,    19,    20,    21,    22,    23,    24,
  591.     25,    26,    27,    28,    29,    -1,    31,    -1,    -1,    -1,
  592.     35,    36,    37,    38,    -1,    -1,    -1,    -1,    -1,    44,
  593.     45,    -1,    47,    -1,    49,    -1,    -1,    52,    53,    -1,
  594.     -1,    -1,    57,     1,    59,     3,     4,    -1,    -1,     7,
  595.      8,    -1,    10,    -1,    -1,    13,    -1,    -1,    -1,    -1,
  596.     -1,    -1,    -1,    -1,    -1,     4,    -1,    -1,     7,     8,
  597.      9,    -1,    -1,    31,    -1,    -1,    -1,    35,    36,    37,
  598.     38,    -1,    -1,    -1,    42,    43,    44,    45,    -1,    47,
  599.     -1,    49,    -1,    -1,    52,    53,    35,    36,     3,     4,
  600.     -1,    59,     7,     8,     9,    44,    45,    12,    47,    -1,
  601.     49,    -1,    -1,    52,    53,    -1,    -1,    -1,    -1,    -1,
  602.     -1,    -1,    -1,    -1,    -1,    -1,    31,    32,    33,    34,
  603.     35,    36,    37,    38,    39,    -1,    41,    42,    43,    44,
  604.     45,    -1,    47,    -1,    49,     3,     4,    52,    53,     7,
  605.      8,    -1,    -1,    -1,    -1,    60,    -1,    -1,    -1,    17,
  606.     -1,    19,    20,    21,    22,    23,    24,    25,    26,    27,
  607.     28,    29,    -1,    31,    -1,    -1,    -1,    35,    36,    37,
  608.     38,    -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,
  609.     -1,    49,    -1,    -1,    52,    53,    -1,    -1,    -1,    57,
  610.     -1,    59,     3,     4,    -1,    -1,     7,     8,     9,    -1,
  611.     -1,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  612.     -1,    -1,     4,    -1,    -1,     7,     8,    -1,    -1,    -1,
  613.     31,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
  614.     41,    42,    43,    44,    45,    -1,    47,    -1,    49,    -1,
  615.     -1,    52,    53,    35,    36,     3,     4,    -1,    59,     7,
  616.      8,     9,    44,    45,    12,    47,    -1,    49,    -1,    -1,
  617.     52,    53,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  618.     -1,    -1,    -1,    31,    32,    33,    34,    35,    36,    37,
  619.     38,    39,    -1,    41,    42,    43,    44,    45,    -1,    47,
  620.      1,    49,     3,     4,    52,    53,     7,     8,    -1,    -1,
  621.     -1,    59,    -1,    -1,    15,    16,    -1,    -1,    -1,    -1,
  622.     -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,    30,
  623.     31,     7,     8,    -1,    35,    36,    37,    38,    -1,    -1,
  624.     -1,    -1,    -1,    44,    45,    -1,    47,    -1,    49,    -1,
  625.     -1,    52,    53,    -1,    -1,    31,    57,    -1,    -1,    35,
  626.     36,    37,    38,    -1,    -1,    -1,    -1,    -1,    44,    45,
  627.     -1,    47,     1,    49,     3,     4,    52,    53,     7,     8,
  628.     -1,    -1,    -1,    59,    -1,    -1,    -1,    -1,    -1,    -1,
  629.     -1,    -1,     1,    -1,     3,     4,    -1,    -1,     7,     8,
  630.     -1,    -1,    31,    -1,    -1,    -1,    35,    36,    37,    38,
  631.     -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,    -1,
  632.     49,    -1,    31,    52,    53,    54,    35,    36,    37,    38,
  633.     -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,     1,
  634.     49,     3,     4,    52,    53,     7,     8,    -1,    -1,    -1,
  635.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     1,    -1,
  636.      3,     4,    -1,    -1,     7,     8,    -1,    -1,    -1,    31,
  637.     -1,    -1,    -1,    35,    36,    37,    38,    -1,    -1,    -1,
  638.     -1,    -1,    44,    45,    -1,    47,    -1,    49,    31,    -1,
  639.     52,    53,    35,    36,    37,    38,    -1,    -1,    -1,    -1,
  640.     -1,    44,    45,    -1,    47,    -1,    49,     3,     4,    52,
  641.     53,     7,     8,     9,    -1,    -1,    12,    -1,    -1,    -1,
  642.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  643.     -1,    -1,    -1,    -1,    -1,    31,    32,    33,    34,    35,
  644.     36,    37,    38,    39,    -1,    41,    42,    43,    44,    45,
  645.     -1,    47,    -1,    49,    -1,    -1,    52,    53,    54,     3,
  646.      4,    -1,    -1,     7,     8,     9,    -1,    -1,    12,    -1,
  647.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  648.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    31,    32,    33,
  649.     34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
  650.     44,    45,    -1,    47,    -1,    49,     3,     4,    52,    53,
  651.      7,     8,     9,    -1,    -1,    12,    -1,    -1,    -1,    -1,
  652.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  653.     -1,    -1,    -1,    -1,    31,    32,    33,    34,    35,    36,
  654.     37,    38,    39,    -1,    41,    42,    43,    44,    45,    -1,
  655.     47,    -1,    49,     3,     4,    52,    53,     7,     8,     9,
  656.     -1,    -1,    12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  657.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  658.     -1,    31,    32,    33,    -1,    35,    36,    37,    38,    -1,
  659.     -1,    41,    42,    43,    44,    45,    -1,    47,    -1,    49,
  660.      3,     4,    52,    53,     7,     8,     9,    -1,    -1,    12,
  661.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  662.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    31,    32,
  663.     33,    34,    35,    36,    37,    38,    39,    40,    -1,    -1,
  664.     -1,    44,    45,    -1,    47,    -1,    49,     3,     4,    52,
  665.     53,     7,     8,     9,    -1,    -1,    12,    -1,    -1,    -1,
  666.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  667.     -1,    -1,    -1,    -1,    -1,    31,    32,    -1,    -1,    35,
  668.     36,    37,    38,    -1,    -1,    41,    42,    43,    44,    45,
  669.     -1,    47,    -1,    49,     3,     4,    52,    53,     7,     8,
  670.      9,    -1,    -1,    12,    -1,    -1,    -1,    -1,    -1,    -1,
  671.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  672.     -1,    -1,    31,    32,    33,    34,    35,    36,    37,    38,
  673.     39,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,    -1,
  674.     49,     3,     4,    52,    53,     7,     8,     9,    -1,    -1,
  675.     12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  676.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    31,
  677.     32,    33,    -1,    35,    36,    37,    38,    -1,    -1,    -1,
  678.     -1,    -1,    44,    45,    -1,    47,    -1,    49,     3,     4,
  679.     52,    53,     7,     8,     9,    -1,    -1,    12,    -1,    -1,
  680.     -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,    -1,
  681.     -1,     7,     8,    -1,    -1,    -1,    31,    32,    -1,    -1,
  682.     35,    36,    37,    38,    -1,    -1,    -1,    -1,    -1,    44,
  683.     45,    -1,    47,    -1,    49,    31,    -1,    52,    53,    35,
  684.     36,    37,    38,    -1,    -1,    -1,    -1,    -1,    44,    45,
  685.     -1,    47,    -1,    49,     3,     4,    52,    53,     7,     8,
  686.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  687.     -1,    -1,    -1,     3,     4,    -1,    -1,     7,     8,    -1,
  688.     -1,    -1,    31,    -1,    -1,    -1,    35,    36,    37,    38,
  689.     -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,    -1,
  690.     49,    31,    -1,    52,    53,    35,    36,    37,    38,    -1,
  691.     -1,    -1,    -1,    -1,    44,    45,    -1,    47,    -1,    49,
  692.      3,     4,    52,    53,     7,     8,    -1,    -1,    -1,    -1,
  693.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,
  694.      4,    -1,    -1,     7,     8,    -1,    -1,    -1,    -1,    -1,
  695.     -1,    -1,    35,    36,    37,    38,    -1,    -1,    -1,    -1,
  696.     -1,    44,    45,    -1,    47,    -1,    49,    -1,    -1,    52,
  697.     53,    35,    36,    37,    38,    -1,    -1,    -1,    -1,     4,
  698.     44,    45,     7,     8,     9,    49,    -1,    12,    52,    53,
  699.     -1,    -1,    -1,    -1,     4,    -1,    -1,     7,     8,     9,
  700.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  701.     35,    36,    -1,    -1,    -1,    -1,    41,    42,    43,    44,
  702.     45,    -1,    47,    -1,    49,    35,    36,    52,    53,    -1,
  703.     -1,    41,    42,    43,    44,    45,    -1,    47,    -1,    49,
  704.     -1,     4,    52,    53,     7,     8,     9,    -1,    -1,    12,
  705.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  706.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  707.     -1,    -1,    35,    36,    -1,    -1,    -1,    -1,    -1,    -1,
  708.     -1,    44,    45,    -1,    47,    -1,    49,    -1,    -1,    52,
  709.     53
  710. };
  711. #define YYPURE 1
  712.  
  713. /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
  714. #line 3 "bison.simple"
  715.  
  716. /* Skeleton output parser for bison,
  717.    Copyright (C) 1984 Bob Corbett and Richard Stallman
  718.  
  719.    This program is free software; you can redistribute it and/or modify
  720.    it under the terms of the GNU General Public License as published by
  721.    the Free Software Foundation; either version 1, or (at your option)
  722.    any later version.
  723.  
  724.    This program is distributed in the hope that it will be useful,
  725.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  726.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  727.    GNU General Public License for more details.
  728.  
  729.    You should have received a copy of the GNU General Public License
  730.    along with this program; if not, write to the Free Software
  731.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  732.  
  733.  
  734. #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__)
  735. #include <alloca.h>
  736. #endif
  737.  
  738. /* This is the parser code that is written into each bison parser
  739.   when the %semantic_parser declaration is not specified in the grammar.
  740.   It was written by Richard Stallman by simplifying the hairy parser
  741.   used when %semantic_parser is specified.  */
  742.  
  743. /* Note: there must be only one dollar sign in this file.
  744.    It is replaced by the list of actions, each action
  745.    as one case of the switch.  */
  746.  
  747. #define yyerrok        (yyerrstatus = 0)
  748. #define yyclearin    (yychar = YYEMPTY)
  749. #define YYEMPTY        -2
  750. #define YYEOF        0
  751. #define YYFAIL        goto yyerrlab;
  752. #define YYACCEPT    return(0)
  753. #define YYABORT     return(1)
  754. #define YYERROR        goto yyerrlab
  755.  
  756. #define YYTERROR    1
  757. #define YYERRCODE    256
  758.  
  759. #ifndef YYIMPURE
  760. #define YYLEX        yylex()
  761. #endif
  762.  
  763. #ifndef YYPURE
  764. #define YYLEX        yylex(&yylval, &yylloc)
  765. #endif
  766.  
  767. /* If nonreentrant, generate the variables here */
  768.  
  769. #ifndef YYIMPURE
  770.  
  771. int    yychar;            /*  the lookahead symbol        */
  772. YYSTYPE    yylval;            /*  the semantic value of the        */
  773.                 /*  lookahead symbol            */
  774.  
  775. YYLTYPE yylloc;            /*  location data for the lookahead    */
  776.                 /*  symbol                */
  777.  
  778. int yynerrs;            /*  number of parse errors so far       */
  779. #endif  /* YYIMPURE */
  780.  
  781. #if YYDEBUG != 0
  782. int yydebug;            /*  nonzero means print parse trace    */
  783. /* Since this is uninitialized, it does not stop multiple parsers
  784.    from coexisting.  */
  785. #endif
  786.  
  787. /*  YYMAXDEPTH indicates the initial size of the parser's stacks    */
  788.  
  789. #ifndef    YYMAXDEPTH
  790. #define YYMAXDEPTH 200
  791. #endif
  792.  
  793. /*  YYMAXLIMIT is the maximum size the stacks can grow to
  794.     (effective only if the built-in stack extension method is used).  */
  795.  
  796. #ifndef YYMAXLIMIT
  797. #define YYMAXLIMIT 10000
  798. #endif
  799.  
  800.  
  801. #line 90 "bison.simple"
  802. int
  803. yyparse()
  804. {
  805.   register int yystate;
  806.   register int yyn;
  807.   register short *yyssp;
  808.   register YYSTYPE *yyvsp;
  809.   YYLTYPE *yylsp;
  810.   int yyerrstatus;    /*  number of tokens to shift before error messages enabled */
  811.   int yychar1;        /*  lookahead token as an internal (translated) token number */
  812.  
  813.   short    yyssa[YYMAXDEPTH];    /*  the state stack            */
  814.   YYSTYPE yyvsa[YYMAXDEPTH];    /*  the semantic value stack        */
  815.   YYLTYPE yylsa[YYMAXDEPTH];    /*  the location stack            */
  816.  
  817.   short *yyss = yyssa;        /*  refer to the stacks thru separate pointers */
  818.   YYSTYPE *yyvs = yyvsa;    /*  to allow yyoverflow to reallocate them elsewhere */
  819.   YYLTYPE *yyls = yylsa;
  820.  
  821.   int yymaxdepth = YYMAXDEPTH;
  822.  
  823. #ifndef YYPURE
  824.   int yychar;
  825.   YYSTYPE yylval;
  826.   YYLTYPE yylloc;
  827.   int yynerrs;
  828. #endif
  829.  
  830.   YYSTYPE yyval;        /*  the variable used to return        */
  831.                 /*  semantic values from the action    */
  832.                 /*  routines                */
  833.  
  834.   int yylen;
  835.  
  836. #if YYDEBUG != 0
  837.   if (yydebug)
  838.     fprintf(stderr, "Starting parse\n");
  839. #endif
  840.  
  841.   yystate = 0;
  842.   yyerrstatus = 0;
  843.   yynerrs = 0;
  844.   yychar = YYEMPTY;        /* Cause a token to be read.  */
  845.  
  846.   /* Initialize stack pointers.
  847.      Waste one element of value and location stack
  848.      so that they stay on the same level as the state stack.  */
  849.  
  850.   yyssp = yyss - 1;
  851.   yyvsp = yyvs;
  852.   yylsp = yyls;
  853.  
  854. /* Push a new state, which is found in  yystate  .  */
  855. /* In all cases, when you get here, the value and location stacks
  856.    have just been pushed. so pushing a state here evens the stacks.  */
  857. yynewstate:
  858.  
  859.   *++yyssp = yystate;
  860.  
  861.   if (yyssp >= yyss + yymaxdepth - 1)
  862.     {
  863.       /* Give user a chance to reallocate the stack */
  864.       /* Use copies of these so that the &'s don't force the real ones into memory. */
  865.       YYSTYPE *yyvs1 = yyvs;
  866.       YYLTYPE *yyls1 = yyls;
  867.       short *yyss1 = yyss;
  868.  
  869.       /* Get the current used size of the three stacks, in elements.  */
  870.       int size = yyssp - yyss + 1;
  871.  
  872. #ifdef yyoverflow
  873.       /* Each stack pointer address is followed by the size of
  874.      the data in use in that stack, in bytes.  */
  875.       yyoverflow("parser stack overflow",
  876.          &yyss1, size * sizeof (*yyssp),
  877.          &yyvs1, size * sizeof (*yyvsp),
  878.          &yyls1, size * sizeof (*yylsp),
  879.          &yymaxdepth);
  880.  
  881.       yyss = yyss1; yyvs = yyvs1; yyls = yyls1;
  882. #else /* no yyoverflow */
  883.       /* Extend the stack our own way.  */
  884.       if (yymaxdepth >= YYMAXLIMIT)
  885.     yyerror("parser stack overflow");
  886.       yymaxdepth *= 2;
  887.       if (yymaxdepth > YYMAXLIMIT)
  888.     yymaxdepth = YYMAXLIMIT;
  889.       yyss = (short *) alloca (yymaxdepth * sizeof (*yyssp));
  890.       bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
  891.       yyvs = (YYSTYPE *) alloca (yymaxdepth * sizeof (*yyvsp));
  892.       bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
  893. #ifdef YYLSP_NEEDED
  894.       yyls = (YYLTYPE *) alloca (yymaxdepth * sizeof (*yylsp));
  895.       bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
  896. #endif
  897. #endif /* no yyoverflow */
  898.  
  899.       yyssp = yyss + size - 1;
  900.       yyvsp = yyvs + size - 1;
  901. #ifdef YYLSP_NEEDED
  902.       yylsp = yyls + size - 1;
  903. #endif
  904.  
  905. #if YYDEBUG != 0
  906.       if (yydebug)
  907.     fprintf(stderr, "Stack size increased to %d\n", yymaxdepth);
  908. #endif
  909.  
  910.       if (yyssp >= yyss + yymaxdepth - 1)
  911.     YYABORT;
  912.     }
  913.  
  914. #if YYDEBUG != 0
  915.   if (yydebug)
  916.     fprintf(stderr, "Entering state %d\n", yystate);
  917. #endif
  918.  
  919. /* Do appropriate processing given the current state.  */
  920. /* Read a lookahead token if we need one and don't already have one.  */
  921. yyresume:
  922.  
  923.   /* First try to decide what to do without reference to lookahead token.  */
  924.  
  925.   yyn = yypact[yystate];
  926.   if (yyn == YYFLAG)
  927.     goto yydefault;
  928.  
  929.   /* Not known => get a lookahead token if don't already have one.  */
  930.  
  931.   /* yychar is either YYEMPTY or YYEOF
  932.      or a valid token in external form.  */
  933.  
  934.   if (yychar == YYEMPTY)
  935.     {
  936. #if YYDEBUG != 0
  937.       if (yydebug)
  938.     fprintf(stderr, "Reading a token: ");
  939. #endif
  940.       yychar = YYLEX;
  941.     }
  942.  
  943.   /* Convert token to internal form (in yychar1) for indexing tables with */
  944.  
  945.   if (yychar <= 0)        /* This means end of input. */
  946.     {
  947.       yychar1 = 0;
  948.       yychar = YYEOF;        /* Don't call YYLEX any more */
  949.  
  950. #if YYDEBUG != 0
  951.       if (yydebug)
  952.     fprintf(stderr, "Now at end of input.\n");
  953. #endif
  954.     }
  955.   else
  956.     {
  957.       yychar1 = YYTRANSLATE(yychar);
  958.  
  959. #if YYDEBUG != 0
  960.       if (yydebug)
  961.     fprintf(stderr, "Next token is %d (%s)\n", yychar, yytname[yychar1]);
  962. #endif
  963.     }
  964.  
  965.   yyn += yychar1;
  966.   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
  967.     goto yydefault;
  968.  
  969.   yyn = yytable[yyn];
  970.  
  971.   /* yyn is what to do for this token type in this state.
  972.      Negative => reduce, -yyn is rule number.
  973.      Positive => shift, yyn is new state.
  974.        New state is final state => don't bother to shift,
  975.        just return success.
  976.      0, or most negative number => error.  */
  977.  
  978.   if (yyn < 0)
  979.     {
  980.       if (yyn == YYFLAG)
  981.     goto yyerrlab;
  982.       yyn = -yyn;
  983.       goto yyreduce;
  984.     }
  985.   else if (yyn == 0)
  986.     goto yyerrlab;
  987.  
  988.   if (yyn == YYFINAL)
  989.     YYACCEPT;
  990.  
  991.   /* Shift the lookahead token.  */
  992.  
  993. #if YYDEBUG != 0
  994.   if (yydebug)
  995.     fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
  996. #endif
  997.  
  998.   /* Discard the token being shifted unless it is eof.  */
  999.   if (yychar != YYEOF)
  1000.     yychar = YYEMPTY;
  1001.  
  1002.   *++yyvsp = yylval;
  1003. #ifdef YYLSP_NEEDED
  1004.   *++yylsp = yylloc;
  1005. #endif
  1006.  
  1007.   /* count tokens shifted since error; after three, turn off error status.  */
  1008.   if (yyerrstatus) yyerrstatus--;
  1009.  
  1010.   yystate = yyn;
  1011.   goto yynewstate;
  1012.  
  1013. /* Do the default action for the current state.  */
  1014. yydefault:
  1015.  
  1016.   yyn = yydefact[yystate];
  1017.   if (yyn == 0)
  1018.     goto yyerrlab;
  1019.  
  1020. /* Do a reduction.  yyn is the number of a rule to reduce with.  */
  1021. yyreduce:
  1022.   yylen = yyr2[yyn];
  1023.   yyval = yyvsp[1-yylen]; /* implement default value of the action */
  1024.  
  1025. #if YYDEBUG != 0
  1026.   if (yydebug)
  1027.     {
  1028.       if (yylen == 1)
  1029.     fprintf (stderr, "Reducing 1 value via line %d, ",
  1030.          yyrline[yyn]);
  1031.       else
  1032.     fprintf (stderr, "Reducing %d values via line %d, ",
  1033.          yylen, yyrline[yyn]);
  1034.     }
  1035. #endif
  1036.  
  1037.  
  1038.   switch (yyn) {
  1039.  
  1040. case 1:
  1041. #line 137 "awk.y"
  1042. { expression_value = yyvsp[-1].nodeval; ;
  1043.     break;}
  1044. case 2:
  1045. #line 142 "awk.y"
  1046.             if (yyvsp[0].nodeval != NULL)
  1047.                 yyval.nodeval = yyvsp[0].nodeval;
  1048.             else
  1049.                 yyval.nodeval = NULL;
  1050.             yyerrok;
  1051.         ;
  1052.     break;}
  1053. case 3:
  1054. #line 151 "awk.y"
  1055. {
  1056.             if (yyvsp[0].nodeval == NULL)
  1057.                 yyval.nodeval = yyvsp[-1].nodeval;
  1058.             else if (yyvsp[-1].nodeval == NULL)
  1059.                 yyval.nodeval = yyvsp[0].nodeval;
  1060.             else {
  1061.                 if (yyvsp[-1].nodeval->type != Node_rule_list)
  1062.                     yyvsp[-1].nodeval = node(yyvsp[-1].nodeval, Node_rule_list,
  1063.                         (NODE*)NULL);
  1064.                 yyval.nodeval = append_right (yyvsp[-1].nodeval,
  1065.                    node(yyvsp[0].nodeval, Node_rule_list,(NODE *) NULL));
  1066.             }
  1067.             yyerrok;
  1068.         ;
  1069.     break;}
  1070. case 4:
  1071. #line 165 "awk.y"
  1072. { yyval.nodeval = NULL; ;
  1073.     break;}
  1074. case 5:
  1075. #line 166 "awk.y"
  1076. { yyval.nodeval = NULL; ;
  1077.     break;}
  1078. case 6:
  1079. #line 170 "awk.y"
  1080. { io_allowed = 0; ;
  1081.     break;}
  1082. case 7:
  1083. #line 172 "awk.y"
  1084. {
  1085.         if (begin_block) {
  1086.             if (begin_block->type != Node_rule_list)
  1087.                 begin_block = node(begin_block, Node_rule_list,
  1088.                     (NODE *)NULL);
  1089.             append_right (begin_block, node(
  1090.                 node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval),
  1091.                 Node_rule_list, (NODE *)NULL) );
  1092.         } else
  1093.             begin_block = node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval);
  1094.         yyval.nodeval = NULL;
  1095.         io_allowed = 1;
  1096.         yyerrok;
  1097.       ;
  1098.     break;}
  1099. case 8:
  1100. #line 186 "awk.y"
  1101. { io_allowed = 0; ;
  1102.     break;}
  1103. case 9:
  1104. #line 188 "awk.y"
  1105. {
  1106.         if (end_block) {
  1107.             if (end_block->type != Node_rule_list)
  1108.                 end_block = node(end_block, Node_rule_list,
  1109.                     (NODE *)NULL);
  1110.             append_right (end_block, node(
  1111.                 node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval),
  1112.                 Node_rule_list, (NODE *)NULL));
  1113.         } else
  1114.             end_block = node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval);
  1115.         yyval.nodeval = NULL;
  1116.         io_allowed = 1;
  1117.         yyerrok;
  1118.       ;
  1119.     break;}
  1120. case 10:
  1121. #line 203 "awk.y"
  1122. {
  1123.         msg ("error near line %d: BEGIN blocks must have an action part", lineno);
  1124.         errcount++;
  1125.         yyerrok;
  1126.       ;
  1127.     break;}
  1128. case 11:
  1129. #line 209 "awk.y"
  1130. {
  1131.         msg ("error near line %d: END blocks must have an action part", lineno);
  1132.         errcount++;
  1133.         yyerrok;
  1134.       ;
  1135.     break;}
  1136. case 12:
  1137. #line 215 "awk.y"
  1138. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_rule_node, yyvsp[0].nodeval); yyerrok; ;
  1139.     break;}
  1140. case 13:
  1141. #line 217 "awk.y"
  1142. { yyval.nodeval = node ((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval); yyerrok; ;
  1143.     break;}
  1144. case 14:
  1145. #line 219 "awk.y"
  1146. { if(yyvsp[-1].nodeval) yyval.nodeval = node (yyvsp[-1].nodeval, Node_rule_node, (NODE *)NULL); yyerrok; ;
  1147.     break;}
  1148. case 15:
  1149. #line 221 "awk.y"
  1150. {
  1151.             func_install(yyvsp[-1].nodeval, yyvsp[0].nodeval);
  1152.             yyval.nodeval = NULL;
  1153.             yyerrok;
  1154.         ;
  1155.     break;}
  1156. case 16:
  1157. #line 230 "awk.y"
  1158. { yyval.sval = yyvsp[0].sval; ;
  1159.     break;}
  1160. case 17:
  1161. #line 232 "awk.y"
  1162. { yyval.sval = yyvsp[0].sval; ;
  1163.     break;}
  1164. case 18:
  1165. #line 237 "awk.y"
  1166. {
  1167.             param_counter = 0;
  1168.         ;
  1169.     break;}
  1170. case 19:
  1171. #line 241 "awk.y"
  1172. {
  1173.             yyval.nodeval = append_right(make_param(yyvsp[-4].sval), yyvsp[-2].nodeval);
  1174.             can_return = 1;
  1175.         ;
  1176.     break;}
  1177. case 20:
  1178. #line 249 "awk.y"
  1179. {
  1180.         yyval.nodeval = yyvsp[-1].nodeval;
  1181.         can_return = 0;
  1182.       ;
  1183.     break;}
  1184. case 21:
  1185. #line 258 "awk.y"
  1186. { yyval.nodeval = yyvsp[0].nodeval; ;
  1187.     break;}
  1188. case 22:
  1189. #line 260 "awk.y"
  1190. { yyval.nodeval = mkrangenode ( node(yyvsp[-2].nodeval, Node_cond_pair, yyvsp[0].nodeval) ); ;
  1191.     break;}
  1192. case 23:
  1193. #line 269 "awk.y"
  1194. { ++want_regexp; ;
  1195.     break;}
  1196. case 24:
  1197. #line 271 "awk.y"
  1198. {
  1199.           want_regexp = 0;
  1200.           yyval.nodeval = node((NODE *)NULL,Node_regex,(NODE *)mk_re_parse(yyvsp[-1].sval, 0));
  1201.           yyval.nodeval -> re_case = 0;
  1202.           emalloc (yyval.nodeval -> re_text, char *, strlen(yyvsp[-1].sval)+1, "regexp");
  1203.           strcpy (yyval.nodeval -> re_text, yyvsp[-1].sval);
  1204.         ;
  1205.     break;}
  1206. case 25:
  1207. #line 282 "awk.y"
  1208. {
  1209.             /* empty actions are different from missing actions */
  1210.             yyval.nodeval = node ((NODE *) NULL, Node_illegal, (NODE *) NULL);
  1211.         ;
  1212.     break;}
  1213. case 26:
  1214. #line 287 "awk.y"
  1215. { yyval.nodeval = yyvsp[-2].nodeval ; ;
  1216.     break;}
  1217. case 27:
  1218. #line 292 "awk.y"
  1219. { yyval.nodeval = yyvsp[0].nodeval; ;
  1220.     break;}
  1221. case 28:
  1222. #line 294 "awk.y"
  1223. {
  1224.             if (yyvsp[-1].nodeval == NULL || yyvsp[-1].nodeval->type != Node_statement_list)
  1225.                 yyvsp[-1].nodeval = node(yyvsp[-1].nodeval, Node_statement_list,(NODE *)NULL);
  1226.                 yyval.nodeval = append_right(yyvsp[-1].nodeval,
  1227.                 node( yyvsp[0].nodeval, Node_statement_list, (NODE *)NULL));
  1228.                 yyerrok;
  1229.         ;
  1230.     break;}
  1231. case 29:
  1232. #line 302 "awk.y"
  1233. { yyval.nodeval = NULL; ;
  1234.     break;}
  1235. case 30:
  1236. #line 304 "awk.y"
  1237. { yyval.nodeval = NULL; ;
  1238.     break;}
  1239. case 31:
  1240. #line 309 "awk.y"
  1241. { yyval.nodetypeval = Node_illegal; ;
  1242.     break;}
  1243. case 32:
  1244. #line 311 "awk.y"
  1245. { yyval.nodetypeval = Node_illegal; ;
  1246.     break;}
  1247. case 33:
  1248. #line 317 "awk.y"
  1249. { yyval.nodeval = NULL; ;
  1250.     break;}
  1251. case 34:
  1252. #line 319 "awk.y"
  1253. { yyval.nodeval = NULL; ;
  1254.     break;}
  1255. case 35:
  1256. #line 321 "awk.y"
  1257. { yyval.nodeval = yyvsp[-1].nodeval; ;
  1258.     break;}
  1259. case 36:
  1260. #line 323 "awk.y"
  1261. { yyval.nodeval = yyvsp[0].nodeval; ;
  1262.     break;}
  1263. case 37:
  1264. #line 325 "awk.y"
  1265. { yyval.nodeval = node (yyvsp[-3].nodeval, Node_K_while, yyvsp[0].nodeval); ;
  1266.     break;}
  1267. case 38:
  1268. #line 327 "awk.y"
  1269. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_K_do, yyvsp[-5].nodeval); ;
  1270.     break;}
  1271. case 39:
  1272. #line 329 "awk.y"
  1273. {
  1274.         yyval.nodeval = node (yyvsp[0].nodeval, Node_K_arrayfor, make_for_loop(variable(yyvsp[-5].sval),
  1275.             (NODE *)NULL, variable(yyvsp[-3].sval)));
  1276.       ;
  1277.     break;}
  1278. case 40:
  1279. #line 334 "awk.y"
  1280. {
  1281.         yyval.nodeval = node(yyvsp[0].nodeval, Node_K_for, (NODE *)make_for_loop(yyvsp[-7].nodeval, yyvsp[-5].nodeval, yyvsp[-3].nodeval));
  1282.       ;
  1283.     break;}
  1284. case 41:
  1285. #line 338 "awk.y"
  1286. {
  1287.         yyval.nodeval = node (yyvsp[0].nodeval, Node_K_for,
  1288.             (NODE *)make_for_loop(yyvsp[-6].nodeval, (NODE *)NULL, yyvsp[-3].nodeval));
  1289.       ;
  1290.     break;}
  1291. case 42:
  1292. #line 344 "awk.y"
  1293. { yyval.nodeval = node ((NODE *)NULL, Node_K_break, (NODE *)NULL); ;
  1294.     break;}
  1295. case 43:
  1296. #line 347 "awk.y"
  1297. { yyval.nodeval = node ((NODE *)NULL, Node_K_continue, (NODE *)NULL); ;
  1298.     break;}
  1299. case 44:
  1300. #line 349 "awk.y"
  1301. { yyval.nodeval = node (yyvsp[-3].nodeval, yyvsp[-5].nodetypeval, yyvsp[-1].nodeval); ;
  1302.     break;}
  1303. case 45:
  1304. #line 351 "awk.y"
  1305. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-3].nodetypeval, yyvsp[-1].nodeval); ;
  1306.     break;}
  1307. case 46:
  1308. #line 353 "awk.y"
  1309. { if (! io_allowed) yyerror("next used in BEGIN or END action"); ;
  1310.     break;}
  1311. case 47:
  1312. #line 355 "awk.y"
  1313. { yyval.nodeval = node ((NODE *)NULL, Node_K_next, (NODE *)NULL); ;
  1314.     break;}
  1315. case 48:
  1316. #line 357 "awk.y"
  1317. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_exit, (NODE *)NULL); ;
  1318.     break;}
  1319. case 49:
  1320. #line 359 "awk.y"
  1321. { if (! can_return) yyerror("return used outside function context"); ;
  1322.     break;}
  1323. case 50:
  1324. #line 361 "awk.y"
  1325. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_return, (NODE *)NULL); ;
  1326.     break;}
  1327. case 51:
  1328. #line 363 "awk.y"
  1329. { yyval.nodeval = node (variable(yyvsp[-4].sval), Node_K_delete, yyvsp[-2].nodeval); ;
  1330.     break;}
  1331. case 52:
  1332. #line 365 "awk.y"
  1333. { yyval.nodeval = yyvsp[-1].nodeval; ;
  1334.     break;}
  1335. case 53:
  1336. #line 370 "awk.y"
  1337. { yyval.nodetypeval = yyvsp[0].nodetypeval; ;
  1338.     break;}
  1339. case 54:
  1340. #line 372 "awk.y"
  1341. { yyval.nodetypeval = yyvsp[0].nodetypeval; ;
  1342.     break;}
  1343. case 55:
  1344. #line 377 "awk.y"
  1345. {
  1346.         yyval.nodeval = node(yyvsp[-3].nodeval, Node_K_if, 
  1347.             node(yyvsp[0].nodeval, Node_if_branches, (NODE *)NULL));
  1348.       ;
  1349.     break;}
  1350. case 56:
  1351. #line 383 "awk.y"
  1352. { yyval.nodeval = node (yyvsp[-6].nodeval, Node_K_if,
  1353.                 node (yyvsp[-3].nodeval, Node_if_branches, yyvsp[0].nodeval)); ;
  1354.     break;}
  1355. case 57:
  1356. #line 389 "awk.y"
  1357. { yyval.nodetypeval = NULL; ;
  1358.     break;}
  1359. case 58:
  1360. #line 391 "awk.y"
  1361. { yyval.nodetypeval = NULL; ;
  1362.     break;}
  1363. case 59:
  1364. #line 396 "awk.y"
  1365. { yyval.nodetypeval = NULL; ;
  1366.     break;}
  1367. case 60:
  1368. #line 398 "awk.y"
  1369. { yyval.nodetypeval = NULL; ;
  1370.     break;}
  1371. case 61:
  1372. #line 403 "awk.y"
  1373. { yyval.nodeval = NULL; ;
  1374.     break;}
  1375. case 62:
  1376. #line 405 "awk.y"
  1377. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_input, (NODE *)NULL); ;
  1378.     break;}
  1379. case 63:
  1380. #line 410 "awk.y"
  1381. { yyval.nodeval = NULL; ;
  1382.     break;}
  1383. case 64:
  1384. #line 412 "awk.y"
  1385. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_output, (NODE *)NULL); ;
  1386.     break;}
  1387. case 65:
  1388. #line 414 "awk.y"
  1389. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_append, (NODE *)NULL); ;
  1390.     break;}
  1391. case 66:
  1392. #line 416 "awk.y"
  1393. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_pipe, (NODE *)NULL); ;
  1394.     break;}
  1395. case 67:
  1396. #line 421 "awk.y"
  1397. { yyval.nodeval = NULL; ;
  1398.     break;}
  1399. case 68:
  1400. #line 423 "awk.y"
  1401. { yyval.nodeval = yyvsp[0].nodeval; ;
  1402.     break;}
  1403. case 69:
  1404. #line 428 "awk.y"
  1405. { yyval.nodeval = make_param(yyvsp[0].sval); ;
  1406.     break;}
  1407. case 70:
  1408. #line 430 "awk.y"
  1409. { yyval.nodeval = append_right(yyvsp[-2].nodeval, make_param(yyvsp[0].sval)); yyerrok; ;
  1410.     break;}
  1411. case 71:
  1412. #line 432 "awk.y"
  1413. { yyval.nodeval = NULL; ;
  1414.     break;}
  1415. case 72:
  1416. #line 434 "awk.y"
  1417. { yyval.nodeval = NULL; ;
  1418.     break;}
  1419. case 73:
  1420. #line 436 "awk.y"
  1421. { yyval.nodeval = NULL; ;
  1422.     break;}
  1423. case 74:
  1424. #line 442 "awk.y"
  1425. { yyval.nodeval = NULL; ;
  1426.     break;}
  1427. case 75:
  1428. #line 444 "awk.y"
  1429. { yyval.nodeval = yyvsp[0].nodeval; ;
  1430.     break;}
  1431. case 76:
  1432. #line 449 "awk.y"
  1433. { yyval.nodeval = NULL; ;
  1434.     break;}
  1435. case 77:
  1436. #line 451 "awk.y"
  1437. { yyval.nodeval = yyvsp[0].nodeval; ;
  1438.     break;}
  1439. case 78:
  1440. #line 456 "awk.y"
  1441. { yyval.nodeval = node (yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL); ;
  1442.     break;}
  1443. case 79:
  1444. #line 458 "awk.y"
  1445. {
  1446.         yyval.nodeval = append_right(yyvsp[-2].nodeval,
  1447.             node( yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL));
  1448.         yyerrok;
  1449.       ;
  1450.     break;}
  1451. case 80:
  1452. #line 464 "awk.y"
  1453. { yyval.nodeval = NULL; ;
  1454.     break;}
  1455. case 81:
  1456. #line 466 "awk.y"
  1457. { yyval.nodeval = NULL; ;
  1458.     break;}
  1459. case 82:
  1460. #line 468 "awk.y"
  1461. { yyval.nodeval = NULL; ;
  1462.     break;}
  1463. case 83:
  1464. #line 470 "awk.y"
  1465. { yyval.nodeval = NULL; ;
  1466.     break;}
  1467. case 84:
  1468. #line 475 "awk.y"
  1469. { yyval.nodeval = NULL; ;
  1470.     break;}
  1471. case 85:
  1472. #line 477 "awk.y"
  1473. { yyval.nodeval = yyvsp[0].nodeval; ;
  1474.     break;}
  1475. case 86:
  1476. #line 482 "awk.y"
  1477. { yyval.nodeval = node (yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL); ;
  1478.     break;}
  1479. case 87:
  1480. #line 484 "awk.y"
  1481. {
  1482.             yyval.nodeval = append_right(yyvsp[-2].nodeval,
  1483.                 node( yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL));
  1484.             yyerrok;
  1485.         ;
  1486.     break;}
  1487. case 88:
  1488. #line 490 "awk.y"
  1489. { yyval.nodeval = NULL; ;
  1490.     break;}
  1491. case 89:
  1492. #line 492 "awk.y"
  1493. { yyval.nodeval = NULL; ;
  1494.     break;}
  1495. case 90:
  1496. #line 494 "awk.y"
  1497. { yyval.nodeval = NULL; ;
  1498.     break;}
  1499. case 91:
  1500. #line 496 "awk.y"
  1501. { yyval.nodeval = NULL; ;
  1502.     break;}
  1503. case 92:
  1504. #line 501 "awk.y"
  1505. { want_assign = 0; ;
  1506.     break;}
  1507. case 93:
  1508. #line 503 "awk.y"
  1509. { yyval.nodeval = node (yyvsp[-3].nodeval, yyvsp[-2].nodetypeval, yyvsp[0].nodeval); ;
  1510.     break;}
  1511. case 94:
  1512. #line 505 "awk.y"
  1513. { yyval.nodeval = node (variable(yyvsp[0].sval), Node_in_array, yyvsp[-3].nodeval); ;
  1514.     break;}
  1515. case 95:
  1516. #line 507 "awk.y"
  1517. {
  1518.           yyval.nodeval = node (yyvsp[0].nodeval, Node_K_getline,
  1519.              node (yyvsp[-3].nodeval, Node_redirect_pipein, (NODE *)NULL));
  1520.         ;
  1521.     break;}
  1522. case 96:
  1523. #line 512 "awk.y"
  1524. {
  1525.           /* "too painful to do right" */
  1526.           /*
  1527.           if (! io_allowed && $3 == NULL)
  1528.             yyerror("non-redirected getline illegal inside BEGIN or END action");
  1529.           */
  1530.           yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_getline, yyvsp[0].nodeval);
  1531.         ;
  1532.     break;}
  1533. case 97:
  1534. #line 521 "awk.y"
  1535. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_and, yyvsp[0].nodeval); ;
  1536.     break;}
  1537. case 98:
  1538. #line 523 "awk.y"
  1539. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_or, yyvsp[0].nodeval); ;
  1540.     break;}
  1541. case 99:
  1542. #line 525 "awk.y"
  1543. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, yyvsp[0].nodeval); ;
  1544.     break;}
  1545. case 100:
  1546. #line 527 "awk.y"
  1547. { yyval.nodeval = yyvsp[0].nodeval; ;
  1548.     break;}
  1549. case 101:
  1550. #line 529 "awk.y"
  1551. { yyval.nodeval = node((NODE *) NULL, Node_nomatch, yyvsp[0].nodeval); ;
  1552.     break;}
  1553. case 102:
  1554. #line 531 "awk.y"
  1555. { yyval.nodeval = node (variable(yyvsp[0].sval), Node_in_array, yyvsp[-2].nodeval); ;
  1556.     break;}
  1557. case 103:
  1558. #line 533 "awk.y"
  1559. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, yyvsp[0].nodeval); ;
  1560.     break;}
  1561. case 104:
  1562. #line 535 "awk.y"
  1563. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_less, yyvsp[0].nodeval); ;
  1564.     break;}
  1565. case 105:
  1566. #line 537 "awk.y"
  1567. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_greater, yyvsp[0].nodeval); ;
  1568.     break;}
  1569. case 106:
  1570. #line 539 "awk.y"
  1571. { yyval.nodeval = node(yyvsp[-4].nodeval, Node_cond_exp, node(yyvsp[-2].nodeval, Node_if_branches, yyvsp[0].nodeval));;
  1572.     break;}
  1573. case 107:
  1574. #line 541 "awk.y"
  1575. { yyval.nodeval = yyvsp[0].nodeval; ;
  1576.     break;}
  1577. case 108:
  1578. #line 543 "awk.y"
  1579. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_concat, yyvsp[0].nodeval); ;
  1580.     break;}
  1581. case 109:
  1582. #line 548 "awk.y"
  1583. { want_assign = 0; ;
  1584.     break;}
  1585. case 110:
  1586. #line 550 "awk.y"
  1587. { yyval.nodeval = node (yyvsp[-3].nodeval, yyvsp[-2].nodetypeval, yyvsp[0].nodeval); ;
  1588.     break;}
  1589. case 111:
  1590. #line 552 "awk.y"
  1591. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_and, yyvsp[0].nodeval); ;
  1592.     break;}
  1593. case 112:
  1594. #line 554 "awk.y"
  1595. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_or, yyvsp[0].nodeval); ;
  1596.     break;}
  1597. case 113:
  1598. #line 556 "awk.y"
  1599. {
  1600.           /* "too painful to do right" */
  1601.           /*
  1602.           if (! io_allowed && $3 == NULL)
  1603.             yyerror("non-redirected getline illegal inside BEGIN or END action");
  1604.           */
  1605.           yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_getline, yyvsp[0].nodeval);
  1606.         ;
  1607.     break;}
  1608. case 114:
  1609. #line 565 "awk.y"
  1610. { yyval.nodeval = yyvsp[0].nodeval; ;
  1611.     break;}
  1612. case 115:
  1613. #line 567 "awk.y"
  1614. { yyval.nodeval = node((NODE *) NULL, Node_nomatch, yyvsp[0].nodeval); ;
  1615.     break;}
  1616. case 116:
  1617. #line 569 "awk.y"
  1618. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, yyvsp[0].nodeval); ;
  1619.     break;}
  1620. case 117:
  1621. #line 571 "awk.y"
  1622. { yyval.nodeval = node (variable(yyvsp[0].sval), Node_in_array, yyvsp[-2].nodeval); ;
  1623.     break;}
  1624. case 118:
  1625. #line 573 "awk.y"
  1626. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, yyvsp[0].nodeval); ;
  1627.     break;}
  1628. case 119:
  1629. #line 575 "awk.y"
  1630. { yyval.nodeval = node(yyvsp[-4].nodeval, Node_cond_exp, node(yyvsp[-2].nodeval, Node_if_branches, yyvsp[0].nodeval));;
  1631.     break;}
  1632. case 120:
  1633. #line 577 "awk.y"
  1634. { yyval.nodeval = yyvsp[0].nodeval; ;
  1635.     break;}
  1636. case 121:
  1637. #line 579 "awk.y"
  1638. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_concat, yyvsp[0].nodeval); ;
  1639.     break;}
  1640. case 122:
  1641. #line 584 "awk.y"
  1642. { yyval.nodeval = node (yyvsp[0].nodeval, Node_not,(NODE *) NULL); ;
  1643.     break;}
  1644. case 123:
  1645. #line 586 "awk.y"
  1646. { yyval.nodeval = yyvsp[-1].nodeval; ;
  1647.     break;}
  1648. case 124:
  1649. #line 588 "awk.y"
  1650. { yyval.nodeval = snode (yyvsp[-1].nodeval, Node_builtin, yyvsp[-3].ptrval); ;
  1651.     break;}
  1652. case 125:
  1653. #line 590 "awk.y"
  1654. { yyval.nodeval = snode (yyvsp[-1].nodeval, Node_builtin, yyvsp[-3].ptrval); ;
  1655.     break;}
  1656. case 126:
  1657. #line 592 "awk.y"
  1658. { yyval.nodeval = snode ((NODE *)NULL, Node_builtin, yyvsp[0].ptrval); ;
  1659.     break;}
  1660. case 127:
  1661. #line 594 "awk.y"
  1662. {
  1663.         yyval.nodeval = node (yyvsp[-1].nodeval, Node_func_call, make_string(yyvsp[-3].sval, strlen(yyvsp[-3].sval)));
  1664.       ;
  1665.     break;}
  1666. case 128:
  1667. #line 598 "awk.y"
  1668. { yyval.nodeval = node (yyvsp[0].nodeval, Node_preincrement, (NODE *)NULL); ;
  1669.     break;}
  1670. case 129:
  1671. #line 600 "awk.y"
  1672. { yyval.nodeval = node (yyvsp[0].nodeval, Node_predecrement, (NODE *)NULL); ;
  1673.     break;}
  1674. case 130:
  1675. #line 602 "awk.y"
  1676. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_postincrement, (NODE *)NULL); ;
  1677.     break;}
  1678. case 131:
  1679. #line 604 "awk.y"
  1680. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_postdecrement, (NODE *)NULL); ;
  1681.     break;}
  1682. case 132:
  1683. #line 606 "awk.y"
  1684. { yyval.nodeval = yyvsp[0].nodeval; ;
  1685.     break;}
  1686. case 133:
  1687. #line 608 "awk.y"
  1688. { yyval.nodeval = yyvsp[0].nodeval; ;
  1689.     break;}
  1690. case 134:
  1691. #line 610 "awk.y"
  1692. { yyval.nodeval = yyvsp[0].nodeval; ;
  1693.     break;}
  1694. case 135:
  1695. #line 614 "awk.y"
  1696. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_exp, yyvsp[0].nodeval); ;
  1697.     break;}
  1698. case 136:
  1699. #line 616 "awk.y"
  1700. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_times, yyvsp[0].nodeval); ;
  1701.     break;}
  1702. case 137:
  1703. #line 618 "awk.y"
  1704. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_quotient, yyvsp[0].nodeval); ;
  1705.     break;}
  1706. case 138:
  1707. #line 620 "awk.y"
  1708. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_mod, yyvsp[0].nodeval); ;
  1709.     break;}
  1710. case 139:
  1711. #line 622 "awk.y"
  1712. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_plus, yyvsp[0].nodeval); ;
  1713.     break;}
  1714. case 140:
  1715. #line 624 "awk.y"
  1716. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_minus, yyvsp[0].nodeval); ;
  1717.     break;}
  1718. case 141:
  1719. #line 626 "awk.y"
  1720. { yyval.nodeval = node (yyvsp[0].nodeval, Node_unary_minus, (NODE *)NULL); ;
  1721.     break;}
  1722. case 142:
  1723. #line 628 "awk.y"
  1724. { yyval.nodeval = yyvsp[0].nodeval; ;
  1725.     break;}
  1726. case 143:
  1727. #line 633 "awk.y"
  1728. { yyval.nodeval = NULL; ;
  1729.     break;}
  1730. case 144:
  1731. #line 635 "awk.y"
  1732. { yyval.nodeval = yyvsp[0].nodeval; ;
  1733.     break;}
  1734. case 145:
  1735. #line 640 "awk.y"
  1736. { want_assign = 1; yyval.nodeval = variable (yyvsp[0].sval); ;
  1737.     break;}
  1738. case 146:
  1739. #line 642 "awk.y"
  1740. { want_assign = 1; yyval.nodeval = node (variable(yyvsp[-3].sval), Node_subscript, yyvsp[-1].nodeval); ;
  1741.     break;}
  1742. case 147:
  1743. #line 644 "awk.y"
  1744. { want_assign = 1; yyval.nodeval = node (yyvsp[0].nodeval, Node_field_spec, (NODE *)NULL); ;
  1745.     break;}
  1746. case 149:
  1747. #line 652 "awk.y"
  1748. { yyerrok; ;
  1749.     break;}
  1750. case 150:
  1751. #line 656 "awk.y"
  1752. { yyval.nodetypeval = Node_illegal; yyerrok; ;
  1753.     break;}
  1754. case 153:
  1755. #line 665 "awk.y"
  1756. { yyerrok; ;
  1757.     break;}
  1758. case 154:
  1759. #line 668 "awk.y"
  1760. { yyval.nodetypeval = Node_illegal; yyerrok; ;
  1761.     break;}
  1762. }
  1763.    /* the action file gets copied in in place of this dollarsign */
  1764. #line 327 "bison.simple"
  1765.  
  1766.   yyvsp -= yylen;
  1767.   yyssp -= yylen;
  1768. #ifdef YYLSP_NEEDED
  1769.   yylsp -= yylen;
  1770. #endif
  1771.  
  1772. #if YYDEBUG != 0
  1773.   if (yydebug)
  1774.     {
  1775.       short *ssp1 = yyss - 1;
  1776.       fprintf (stderr, "state stack now");
  1777.       while (ssp1 != yyssp)
  1778.     fprintf (stderr, " %d", *++ssp1);
  1779.       fprintf (stderr, "\n");
  1780.     }
  1781. #endif
  1782.  
  1783.   *++yyvsp = yyval;
  1784.  
  1785. #ifdef YYLSP_NEEDED
  1786.   yylsp++;
  1787.   if (yylen == 0)
  1788.     {
  1789.       yylsp->first_line = yylloc.first_line;
  1790.       yylsp->first_column = yylloc.first_column;
  1791.       yylsp->last_line = (yylsp-1)->last_line;
  1792.       yylsp->last_column = (yylsp-1)->last_column;
  1793.       yylsp->text = 0;
  1794.     }
  1795.   else
  1796.     {
  1797.       yylsp->last_line = (yylsp+yylen-1)->last_line;
  1798.       yylsp->last_column = (yylsp+yylen-1)->last_column;
  1799.     }
  1800. #endif
  1801.  
  1802.   /* Now "shift" the result of the reduction.
  1803.      Determine what state that goes to,
  1804.      based on the state we popped back to
  1805.      and the rule number reduced by.  */
  1806.  
  1807.   yyn = yyr1[yyn];
  1808.  
  1809.   yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
  1810.   if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
  1811.     yystate = yytable[yystate];
  1812.   else
  1813.     yystate = yydefgoto[yyn - YYNTBASE];
  1814.  
  1815.   goto yynewstate;
  1816.  
  1817. yyerrlab:   /* here on detecting error */
  1818.  
  1819.   if (! yyerrstatus)
  1820.     /* If not already recovering from an error, report this error.  */
  1821.     {
  1822.       ++yynerrs;
  1823.       yyerror("parse error");
  1824.     }
  1825.  
  1826.   if (yyerrstatus == 3)
  1827.     {
  1828.       /* if just tried and failed to reuse lookahead token after an error, discard it.  */
  1829.  
  1830.       /* return failure if at end of input */
  1831.       if (yychar == YYEOF)
  1832.     YYABORT;
  1833.  
  1834. #if YYDEBUG != 0
  1835.       if (yydebug)
  1836.     fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
  1837. #endif
  1838.  
  1839.       yychar = YYEMPTY;
  1840.     }
  1841.  
  1842.   /* Else will try to reuse lookahead token
  1843.      after shifting the error token.  */
  1844.  
  1845.   yyerrstatus = 3;        /* Each real token shifted decrements this */
  1846.  
  1847.   goto yyerrhandle;
  1848.  
  1849. yyerrdefault:  /* current state does not do anything special for the error token. */
  1850.  
  1851. #if 0
  1852.   /* This is wrong; only states that explicitly want error tokens
  1853.      should shift them.  */
  1854.   yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
  1855.   if (yyn) goto yydefault;
  1856. #endif
  1857.  
  1858. yyerrpop:   /* pop the current state because it cannot handle the error token */
  1859.  
  1860.   if (yyssp == yyss) YYABORT;
  1861.   yyvsp--;
  1862.   yystate = *--yyssp;
  1863. #ifdef YYLSP_NEEDED
  1864.   yylsp--;
  1865. #endif
  1866.  
  1867. #if YYDEBUG != 0
  1868.   if (yydebug)
  1869.     {
  1870.       short *ssp1 = yyss - 1;
  1871.       fprintf (stderr, "Error: state stack now");
  1872.       while (ssp1 != yyssp)
  1873.     fprintf (stderr, " %d", *++ssp1);
  1874.       fprintf (stderr, "\n");
  1875.     }
  1876. #endif
  1877.  
  1878. yyerrhandle:
  1879.  
  1880.   yyn = yypact[yystate];
  1881.   if (yyn == YYFLAG)
  1882.     goto yyerrdefault;
  1883.  
  1884.   yyn += YYTERROR;
  1885.   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
  1886.     goto yyerrdefault;
  1887.  
  1888.   yyn = yytable[yyn];
  1889.   if (yyn < 0)
  1890.     {
  1891.       if (yyn == YYFLAG)
  1892.     goto yyerrpop;
  1893.       yyn = -yyn;
  1894.       goto yyreduce;
  1895.     }
  1896.   else if (yyn == 0)
  1897.     goto yyerrpop;
  1898.  
  1899.   if (yyn == YYFINAL)
  1900.     YYACCEPT;
  1901.  
  1902. #if YYDEBUG != 0
  1903.   if (yydebug)
  1904.     fprintf(stderr, "Shifting error token, ");
  1905. #endif
  1906.  
  1907.   *++yyvsp = yylval;
  1908. #ifdef YYLSP_NEEDED
  1909.   *++yylsp = yylloc;
  1910. #endif
  1911.  
  1912.   yystate = yyn;
  1913.   goto yynewstate;
  1914. }
  1915. #line 671 "awk.y"
  1916.  
  1917.  
  1918. struct token {
  1919.     char *operator;        /* text to match */
  1920.     NODETYPE value;        /* node type */
  1921.     int class;        /* lexical class */
  1922.     short nostrict;        /* ignore if in strict compatibility mode */
  1923.     NODE *(*ptr) ();    /* function that implements this keyword */
  1924. };
  1925.  
  1926. extern NODE
  1927.     *do_exp(),    *do_getline(),    *do_index(),    *do_length(),
  1928.     *do_sqrt(),    *do_log(),    *do_sprintf(),    *do_substr(),
  1929.     *do_split(),    *do_system(),    *do_int(),    *do_close(),
  1930.     *do_atan2(),    *do_sin(),    *do_cos(),    *do_rand(),
  1931.     *do_srand(),    *do_match(),    *do_tolower(),    *do_toupper(),
  1932.     *do_sub(),    *do_gsub();
  1933.  
  1934. /* Special functions for debugging */
  1935. #ifdef DEBUG
  1936. NODE *do_prvars(), *do_bp();
  1937. #endif
  1938.  
  1939. /* Tokentab is sorted ascii ascending order, so it can be binary searched. */
  1940.  
  1941. static struct token tokentab[] = {
  1942.     { "BEGIN",    Node_illegal,        LEX_BEGIN,    0,    0 },
  1943.     { "END",    Node_illegal,        LEX_END,    0,    0 },
  1944.     { "atan2",    Node_builtin,        LEX_BUILTIN,    0,    do_atan2 },
  1945. #ifdef DEBUG
  1946.     { "bp",        Node_builtin,        LEX_BUILTIN,    0,    do_bp },
  1947. #endif
  1948.     { "break",    Node_K_break,        LEX_BREAK,    0,    0 },
  1949.     { "close",    Node_builtin,        LEX_BUILTIN,    0,    do_close },
  1950.     { "continue",    Node_K_continue,    LEX_CONTINUE,    0,    0 },
  1951.     { "cos",    Node_builtin,        LEX_BUILTIN,    0,    do_cos },
  1952.     { "delete",    Node_K_delete,        LEX_DELETE,    0,    0 },
  1953.     { "do",        Node_K_do,        LEX_DO,        0,    0 },
  1954.     { "else",    Node_illegal,        LEX_ELSE,    0,    0 },
  1955.     { "exit",    Node_K_exit,        LEX_EXIT,    0,    0 },
  1956.     { "exp",    Node_builtin,        LEX_BUILTIN,    0,    do_exp },
  1957.     { "for",    Node_K_for,        LEX_FOR,    0,    0 },
  1958.     { "func",    Node_K_function,    LEX_FUNCTION,    0,    0 },
  1959.     { "function",    Node_K_function,    LEX_FUNCTION,    0,    0 },
  1960.     { "getline",    Node_K_getline,        LEX_GETLINE,    0,    0 },
  1961.     { "gsub",    Node_builtin,        LEX_BUILTIN,    0,    do_gsub },
  1962.     { "if",        Node_K_if,        LEX_IF,        0,    0 },
  1963.     { "in",        Node_illegal,        LEX_IN,        0,    0 },
  1964.     { "index",    Node_builtin,        LEX_BUILTIN,    0,    do_index },
  1965.     { "int",    Node_builtin,        LEX_BUILTIN,    0,    do_int },
  1966.     { "length",    Node_builtin,        LEX_LENGTH,    0,    do_length },
  1967.     { "log",    Node_builtin,        LEX_BUILTIN,    0,    do_log },
  1968.     { "match",    Node_builtin,        LEX_BUILTIN,    0,    do_match },
  1969.     { "next",    Node_K_next,        LEX_NEXT,    0,    0 },
  1970.     { "print",    Node_K_print,        LEX_PRINT,    0,    0 },
  1971.     { "printf",    Node_K_printf,        LEX_PRINTF,    0,    0 },
  1972. #ifdef DEBUG
  1973.     { "prvars",    Node_builtin,        LEX_BUILTIN,    0,    do_prvars },
  1974. #endif
  1975.     { "rand",    Node_builtin,        LEX_BUILTIN,    0,    do_rand },
  1976.     { "return",    Node_K_return,        LEX_RETURN,    0,    0 },
  1977.     { "sin",    Node_builtin,        LEX_BUILTIN,    0,    do_sin },
  1978.     { "split",    Node_builtin,        LEX_BUILTIN,    0,    do_split },
  1979.     { "sprintf",    Node_builtin,        LEX_BUILTIN,    0,    do_sprintf },
  1980.     { "sqrt",    Node_builtin,        LEX_BUILTIN,    0,    do_sqrt },
  1981.     { "srand",    Node_builtin,        LEX_BUILTIN,    0,    do_srand },
  1982.     { "sub",    Node_builtin,        LEX_BUILTIN,    0,    do_sub },
  1983.     { "substr",    Node_builtin,        LEX_BUILTIN,    0,    do_substr },
  1984.     { "system",    Node_builtin,        LEX_BUILTIN,    0,    do_system },
  1985.     { "tolower",    Node_builtin,        LEX_BUILTIN,    0,    do_tolower },
  1986.     { "toupper",    Node_builtin,        LEX_BUILTIN,    0,    do_toupper },
  1987.     { "while",    Node_K_while,        LEX_WHILE,    0,    0 },
  1988. };
  1989.  
  1990. static char *token_start;
  1991.  
  1992. /* VARARGS0 */
  1993. static void
  1994. yyerror(va_alist)
  1995. va_dcl
  1996. {
  1997.     va_list args;
  1998.     char *mesg;
  1999.     register char *ptr, *beg;
  2000.     char *scan;
  2001.  
  2002.     errcount++;
  2003.     va_start(args);
  2004.     mesg = va_arg(args, char *);
  2005.     va_end(args);
  2006.     /* Find the current line in the input file */
  2007.     if (! lexptr) {
  2008.         beg = "(END OF FILE)";
  2009.         ptr = beg + 13;
  2010.     } else {
  2011.         if (*lexptr == '\n' && lexptr != lexptr_begin)
  2012.             --lexptr;
  2013.         for (beg = lexptr; beg != lexptr_begin && *beg != '\n'; --beg)
  2014.             ;
  2015.         /* NL isn't guaranteed */
  2016.         for (ptr = lexptr; *ptr && *ptr != '\n'; ptr++)
  2017.             ;
  2018.         if (beg != lexptr_begin)
  2019.             beg++;
  2020.     }
  2021.     msg("syntax error near line %d:\n%.*s", lineno, ptr - beg, beg);
  2022.     scan = beg;
  2023.     while (scan < token_start)
  2024.         if (*scan++ == '\t')
  2025.             putc('\t', stderr);
  2026.         else
  2027.             putc(' ', stderr);
  2028.     putc('^', stderr);
  2029.     putc(' ', stderr);
  2030.     vfprintf(stderr, mesg, args);
  2031.     putc('\n', stderr);
  2032.     exit(1);
  2033. }
  2034.  
  2035. /*
  2036.  * Parse a C escape sequence.  STRING_PTR points to a variable containing a
  2037.  * pointer to the string to parse.  That pointer is updated past the
  2038.  * characters we use.  The value of the escape sequence is returned. 
  2039.  *
  2040.  * A negative value means the sequence \ newline was seen, which is supposed to
  2041.  * be equivalent to nothing at all. 
  2042.  *
  2043.  * If \ is followed by a null character, we return a negative value and leave
  2044.  * the string pointer pointing at the null character. 
  2045.  *
  2046.  * If \ is followed by 000, we return 0 and leave the string pointer after the
  2047.  * zeros.  A value of 0 does not mean end of string.  
  2048.  */
  2049.  
  2050. int
  2051. parse_escape(string_ptr)
  2052. char **string_ptr;
  2053. {
  2054.     register int c = *(*string_ptr)++;
  2055.     register int i;
  2056.     register int count = 0;
  2057.  
  2058.     switch (c) {
  2059.     case 'a':
  2060.         return BELL;
  2061.     case 'b':
  2062.         return '\b';
  2063.     case 'f':
  2064.         return '\f';
  2065.     case 'n':
  2066.         return '\n';
  2067.     case 'r':
  2068.         return '\r';
  2069.     case 't':
  2070.         return '\t';
  2071.     case 'v':
  2072.         return '\v';
  2073.     case '\n':
  2074.         return -2;
  2075.     case 0:
  2076.         (*string_ptr)--;
  2077.         return -1;
  2078.     case '0':
  2079.     case '1':
  2080.     case '2':
  2081.     case '3':
  2082.     case '4':
  2083.     case '5':
  2084.     case '6':
  2085.     case '7':
  2086.         i = c - '0';
  2087.         count = 0;
  2088.         while (++count < 3) {
  2089.             if ((c = *(*string_ptr)++) >= '0' && c <= '7') {
  2090.                 i *= 8;
  2091.                 i += c - '0';
  2092.             } else {
  2093.                 (*string_ptr)--;
  2094.                 break;
  2095.             }
  2096.         }
  2097.         return i;
  2098.     case 'x':
  2099.         i = 0;
  2100.         while (1) {
  2101.             if (isxdigit((c = *(*string_ptr)++))) {
  2102.                 if (isdigit(c))
  2103.                     i += c - '0';
  2104.                 else if (isupper(c))
  2105.                     i += c - 'A' + 10;
  2106.                 else
  2107.                     i += c - 'a' + 10;
  2108.             } else {
  2109.                 (*string_ptr)--;
  2110.                 break;
  2111.             }
  2112.         }
  2113.         return i;
  2114.     default:
  2115.         return c;
  2116.     }
  2117. }
  2118.  
  2119. /*
  2120.  * Read the input and turn it into tokens. Input is now read from a file
  2121.  * instead of from malloc'ed memory. The main program takes a program
  2122.  * passed as a command line argument and writes it to a temp file. Otherwise
  2123.  * the file name is made available in an external variable.
  2124.  */
  2125.  
  2126. static int
  2127. yylex()
  2128. {
  2129.     register int c;
  2130.     register int namelen;
  2131.     register char *tokstart;
  2132.     char *tokkey;
  2133.     static did_newline = 0;    /* the grammar insists that actions end
  2134.                  * with newlines.  This was easier than
  2135.                  * hacking the grammar. */
  2136.     int seen_e = 0;        /* These are for numbers */
  2137.     int seen_point = 0;
  2138.     int esc_seen;
  2139.     extern char **sourcefile;
  2140.     extern int tempsource, numfiles;
  2141.     static int file_opened = 0;
  2142.     static FILE *fin;
  2143.     static char cbuf[BUFSIZ];
  2144.     int low, mid, high;
  2145. #ifdef DEBUG
  2146.     extern int debugging;
  2147. #endif
  2148.  
  2149.     if (! file_opened) {
  2150.         file_opened = 1;
  2151. #ifdef DEBUG
  2152.         if (debugging) {
  2153.             int i;
  2154.  
  2155.             for (i = 0; i <= numfiles; i++)
  2156.                 fprintf (stderr, "sourcefile[%d] = %s\n", i,
  2157.                         sourcefile[i]);
  2158.         }
  2159. #endif
  2160.     nextfile:
  2161.         if ((fin = pathopen (sourcefile[++curinfile])) == NULL)
  2162.             fatal("cannot open `%s' for reading (%s)",
  2163.                 sourcefile[curinfile],
  2164.                 strerror(errno));
  2165.         *(lexptr = cbuf) = '\0';
  2166.         /*
  2167.          * immediately unlink the tempfile so that it will
  2168.          * go away cleanly if we bomb.
  2169.          */
  2170.         if (tempsource && curinfile == 0)
  2171.             (void) unlink (sourcefile[curinfile]);
  2172.     }
  2173.  
  2174. retry:
  2175.     if (! *lexptr)
  2176.         if (fgets (cbuf, sizeof cbuf, fin) == NULL) {
  2177.             if (fin != NULL)
  2178.                 fclose (fin);    /* be neat and clean */
  2179.             if (curinfile < numfiles)
  2180.                 goto nextfile;
  2181.             return 0;
  2182.         } else
  2183.             lexptr = lexptr_begin = cbuf;
  2184.  
  2185.     if (want_regexp) {
  2186.         int in_brack = 0;
  2187.  
  2188.         want_regexp = 0;
  2189.         token_start = tokstart = lexptr;
  2190.         while (c = *lexptr++) {
  2191.             switch (c) {
  2192.             case '[':
  2193.                 in_brack = 1;
  2194.                 break;
  2195.             case ']':
  2196.                 in_brack = 0;
  2197.                 break;
  2198.             case '\\':
  2199.                 if (*lexptr++ == '\0') {
  2200.                     yyerror("unterminated regexp ends with \\");
  2201.                     return ERROR;
  2202.                 } else if (lexptr[-1] == '\n')
  2203.                     goto retry;
  2204.                 break;
  2205.             case '/':    /* end of the regexp */
  2206.                 if (in_brack)
  2207.                     break;
  2208.  
  2209.                 lexptr--;
  2210.                 yylval.sval = tokstart;
  2211.                 return REGEXP;
  2212.             case '\n':
  2213.                 lineno++;
  2214.             case '\0':
  2215.                 lexptr--;    /* so error messages work */
  2216.                 yyerror("unterminated regexp");
  2217.                 return ERROR;
  2218.             }
  2219.         }
  2220.     }
  2221.  
  2222.     if (*lexptr == '\n') {
  2223.         lexptr++;
  2224.         lineno++;
  2225.         return NEWLINE;
  2226.     }
  2227.  
  2228.     while (*lexptr == ' ' || *lexptr == '\t')
  2229.         lexptr++;
  2230.  
  2231.     token_start = tokstart = lexptr;
  2232.  
  2233.     switch (c = *lexptr++) {
  2234.     case 0:
  2235.         return 0;
  2236.  
  2237.     case '\n':
  2238.         lineno++;
  2239.         return NEWLINE;
  2240.  
  2241.     case '#':        /* it's a comment */
  2242.         while (*lexptr != '\n' && *lexptr != '\0')
  2243.             lexptr++;
  2244.         goto retry;
  2245.  
  2246.     case '\\':
  2247.         if (*lexptr == '\n') {
  2248.             lineno++;
  2249.             lexptr++;
  2250.             goto retry;
  2251.         } else
  2252.             break;
  2253.     case ')':
  2254.     case ']':
  2255.     case '(':    
  2256.     case '[':
  2257.     case '$':
  2258.     case ';':
  2259.     case ':':
  2260.     case '?':
  2261.  
  2262.         /*
  2263.          * set node type to ILLEGAL because the action should set it
  2264.          * to the right thing 
  2265.          */
  2266.         yylval.nodetypeval = Node_illegal;
  2267.         return c;
  2268.  
  2269.     case '{':
  2270.     case ',':
  2271.         yylval.nodetypeval = Node_illegal;
  2272.         return c;
  2273.  
  2274.     case '*':
  2275.         if (*lexptr == '=') {
  2276.             yylval.nodetypeval = Node_assign_times;
  2277.             lexptr++;
  2278.             return ASSIGNOP;
  2279.         } else if (*lexptr == '*') {    /* make ** and **= aliases
  2280.                          * for ^ and ^= */
  2281.             if (lexptr[1] == '=') {
  2282.                 yylval.nodetypeval = Node_assign_exp;
  2283.                 lexptr += 2;
  2284.                 return ASSIGNOP;
  2285.             } else {
  2286.                 yylval.nodetypeval = Node_illegal;
  2287.                 lexptr++;
  2288.                 return '^';
  2289.             }
  2290.         }
  2291.         yylval.nodetypeval = Node_illegal;
  2292.         return c;
  2293.  
  2294.     case '/':
  2295.         if (want_assign && *lexptr == '=') {
  2296.             yylval.nodetypeval = Node_assign_quotient;
  2297.             lexptr++;
  2298.             return ASSIGNOP;
  2299.         }
  2300.         yylval.nodetypeval = Node_illegal;
  2301.         return c;
  2302.  
  2303.     case '%':
  2304.         if (*lexptr == '=') {
  2305.             yylval.nodetypeval = Node_assign_mod;
  2306.             lexptr++;
  2307.             return ASSIGNOP;
  2308.         }
  2309.         yylval.nodetypeval = Node_illegal;
  2310.         return c;
  2311.  
  2312.     case '^':
  2313.         if (*lexptr == '=') {
  2314.             yylval.nodetypeval = Node_assign_exp;
  2315.             lexptr++;
  2316.             return ASSIGNOP;
  2317.         }
  2318.         yylval.nodetypeval = Node_illegal;
  2319.         return c;
  2320.  
  2321.     case '+':
  2322.         if (*lexptr == '=') {
  2323.             yylval.nodetypeval = Node_assign_plus;
  2324.             lexptr++;
  2325.             return ASSIGNOP;
  2326.         }
  2327.         if (*lexptr == '+') {
  2328.             yylval.nodetypeval = Node_illegal;
  2329.             lexptr++;
  2330.             return INCREMENT;
  2331.         }
  2332.         yylval.nodetypeval = Node_illegal;
  2333.         return c;
  2334.  
  2335.     case '!':
  2336.         if (*lexptr == '=') {
  2337.             yylval.nodetypeval = Node_notequal;
  2338.             lexptr++;
  2339.             return RELOP;
  2340.         }
  2341.         if (*lexptr == '~') {
  2342.             yylval.nodetypeval = Node_nomatch;
  2343.             lexptr++;
  2344.             return MATCHOP;
  2345.         }
  2346.         yylval.nodetypeval = Node_illegal;
  2347.         return c;
  2348.  
  2349.     case '<':
  2350.         if (*lexptr == '=') {
  2351.             yylval.nodetypeval = Node_leq;
  2352.             lexptr++;
  2353.             return RELOP;
  2354.         }
  2355.         yylval.nodetypeval = Node_less;
  2356.         return c;
  2357.  
  2358.     case '=':
  2359.         if (*lexptr == '=') {
  2360.             yylval.nodetypeval = Node_equal;
  2361.             lexptr++;
  2362.             return RELOP;
  2363.         }
  2364.         yylval.nodetypeval = Node_assign;
  2365.         return ASSIGNOP;
  2366.  
  2367.     case '>':
  2368.         if (*lexptr == '=') {
  2369.             yylval.nodetypeval = Node_geq;
  2370.             lexptr++;
  2371.             return RELOP;
  2372.         } else if (*lexptr == '>') {
  2373.             yylval.nodetypeval = Node_redirect_append;
  2374.             lexptr++;
  2375.             return APPEND_OP;
  2376.         }
  2377.         yylval.nodetypeval = Node_greater;
  2378.         return c;
  2379.  
  2380.     case '~':
  2381.         yylval.nodetypeval = Node_match;
  2382.         return MATCHOP;
  2383.  
  2384.     case '}':
  2385.         /*
  2386.          * Added did newline stuff.  Easier than
  2387.          * hacking the grammar
  2388.          */
  2389.         if (did_newline) {
  2390.             did_newline = 0;
  2391.             return c;
  2392.         }
  2393.         did_newline++;
  2394.         --lexptr;
  2395.         return NEWLINE;
  2396.  
  2397.     case '"':
  2398.         esc_seen = 0;
  2399.         while (*lexptr != '\0') {
  2400.             switch (*lexptr++) {
  2401.             case '\\':
  2402.                 esc_seen = 1;
  2403.                 if (*lexptr == '\n')
  2404.                     yyerror("newline in string");
  2405.                 if (*lexptr++ != '\0')
  2406.                     break;
  2407.                 /* fall through */
  2408.             case '\n':
  2409.                 lexptr--;
  2410.                 yyerror("unterminated string");
  2411.                 return ERROR;
  2412.             case '"':
  2413.                 yylval.nodeval = make_str_node(tokstart + 1,
  2414.                         lexptr-tokstart-2, esc_seen);
  2415.                 yylval.nodeval->flags |= PERM;
  2416.                 return YSTRING;
  2417.             }
  2418.         }
  2419.         return ERROR;
  2420.  
  2421.     case '-':
  2422.         if (*lexptr == '=') {
  2423.             yylval.nodetypeval = Node_assign_minus;
  2424.             lexptr++;
  2425.             return ASSIGNOP;
  2426.         }
  2427.         if (*lexptr == '-') {
  2428.             yylval.nodetypeval = Node_illegal;
  2429.             lexptr++;
  2430.             return DECREMENT;
  2431.         }
  2432.         yylval.nodetypeval = Node_illegal;
  2433.         return c;
  2434.  
  2435.     case '0':
  2436.     case '1':
  2437.     case '2':
  2438.     case '3':
  2439.     case '4':
  2440.     case '5':
  2441.     case '6':
  2442.     case '7':
  2443.     case '8':
  2444.     case '9':
  2445.     case '.':
  2446.         /* It's a number */
  2447.         for (namelen = 0; (c = tokstart[namelen]) != '\0'; namelen++) {
  2448.             switch (c) {
  2449.             case '.':
  2450.                 if (seen_point)
  2451.                     goto got_number;
  2452.                 ++seen_point;
  2453.                 break;
  2454.             case 'e':
  2455.             case 'E':
  2456.                 if (seen_e)
  2457.                     goto got_number;
  2458.                 ++seen_e;
  2459.                 if (tokstart[namelen + 1] == '-' ||
  2460.                     tokstart[namelen + 1] == '+')
  2461.                     namelen++;
  2462.                 break;
  2463.             case '0':
  2464.             case '1':
  2465.             case '2':
  2466.             case '3':
  2467.             case '4':
  2468.             case '5':
  2469.             case '6':
  2470.             case '7':
  2471.             case '8':
  2472.             case '9':
  2473.                 break;
  2474.             default:
  2475.                 goto got_number;
  2476.             }
  2477.         }
  2478.  
  2479. got_number:
  2480.         lexptr = tokstart + namelen;
  2481.         /*
  2482.         yylval.nodeval = make_string(tokstart, namelen);
  2483.         (void) force_number(yylval.nodeval);
  2484.         */
  2485.         yylval.nodeval = make_number(atof(tokstart));
  2486.         yylval.nodeval->flags |= PERM;
  2487.         return NUMBER;
  2488.  
  2489.     case '&':
  2490.         if (*lexptr == '&') {
  2491.             yylval.nodetypeval = Node_and;
  2492.             while (c = *++lexptr) {
  2493.                 if (c == '#')
  2494.                     while ((c = *++lexptr) != '\n'
  2495.                            && c != '\0')
  2496.                         ;
  2497.                 if (c == '\n')
  2498.                     lineno++;
  2499.                 else if (! isspace(c))
  2500.                     break;
  2501.             }
  2502.             return LEX_AND;
  2503.         }
  2504.         return ERROR;
  2505.  
  2506.     case '|':
  2507.         if (*lexptr == '|') {
  2508.             yylval.nodetypeval = Node_or;
  2509.             while (c = *++lexptr) {
  2510.                 if (c == '#')
  2511.                     while ((c = *++lexptr) != '\n'
  2512.                            && c != '\0')
  2513.                         ;
  2514.                 if (c == '\n')
  2515.                     lineno++;
  2516.                 else if (! isspace(c))
  2517.                     break;
  2518.             }
  2519.             return LEX_OR;
  2520.         }
  2521.         yylval.nodetypeval = Node_illegal;
  2522.         return c;
  2523.     }
  2524.  
  2525.     if (c != '_' && ! isalpha(c)) {
  2526.         yyerror("Invalid char '%c' in expression\n", c);
  2527.         return ERROR;
  2528.     }
  2529.  
  2530.     /* it's some type of name-type-thing.  Find its length */
  2531.     for (namelen = 0; is_identchar(tokstart[namelen]); namelen++)
  2532.         /* null */ ;
  2533.     emalloc(tokkey, char *, namelen+1, "yylex");
  2534.     memcpy(tokkey, tokstart, namelen);
  2535.     tokkey[namelen] = '\0';
  2536.  
  2537.     /* See if it is a special token.  */
  2538.     low = 0;
  2539.     high = (sizeof (tokentab) / sizeof (tokentab[0])) - 1;
  2540.     while (low <= high) {
  2541.         int i, c;
  2542.  
  2543.         mid = (low + high) / 2;
  2544.         c = *tokstart - tokentab[mid].operator[0];
  2545.         i = c ? c : strcmp (tokkey, tokentab[mid].operator);
  2546.  
  2547.         if (i < 0) {        /* token < mid */
  2548.             high = mid - 1;
  2549.         } else if (i > 0) {    /* token > mid */
  2550.             low = mid + 1;
  2551.         } else {
  2552.             lexptr = tokstart + namelen;
  2553.             if (strict && tokentab[mid].nostrict)
  2554.                 break;
  2555.             if (tokentab[mid].class == LEX_BUILTIN
  2556.                 || tokentab[mid].class == LEX_LENGTH)
  2557.                 yylval.ptrval = tokentab[mid].ptr;
  2558.             else
  2559.                 yylval.nodetypeval = tokentab[mid].value;
  2560.             return tokentab[mid].class;
  2561.         }
  2562.     }
  2563.  
  2564.     /* It's a name.  See how long it is.  */
  2565.     yylval.sval = tokkey;
  2566.     lexptr = tokstart + namelen;
  2567.     if (*lexptr == '(')
  2568.         return FUNC_CALL;
  2569.     else
  2570.         return NAME;
  2571. }
  2572.  
  2573. #ifndef DEFPATH
  2574. #ifdef MSDOS
  2575. #define DEFPATH    "."
  2576. #define ENVSEP    ';'
  2577. #else
  2578. #define DEFPATH    ".:/usr/lib/awk:/usr/local/lib/awk"
  2579. #define ENVSEP    ':'
  2580. #endif
  2581. #endif
  2582.  
  2583. static FILE *
  2584. pathopen (file)
  2585. char *file;
  2586. {
  2587.     static char *savepath = DEFPATH;
  2588.     static int first = 1;
  2589.     char *awkpath, *cp;
  2590.     char trypath[BUFSIZ];
  2591.     FILE *fp;
  2592. #ifdef DEBUG
  2593.     extern int debugging;
  2594. #endif
  2595.     int fd;
  2596.  
  2597.     if (strcmp (file, "-") == 0)
  2598.         return (stdin);
  2599.  
  2600.     if (strict)
  2601.         return (fopen (file, "r"));
  2602.  
  2603.     if (first) {
  2604.         first = 0;
  2605.         if ((awkpath = getenv ("AWKPATH")) != NULL && *awkpath)
  2606.             savepath = awkpath;    /* used for restarting */
  2607.     }
  2608.     awkpath = savepath;
  2609.  
  2610.     /* some kind of path name, no search */
  2611. #ifndef MSDOS
  2612.     if (strchr (file, '/') != NULL)
  2613. #else
  2614.     if (strchr (file, '/') != NULL || strchr (file, '\\') != NULL
  2615.             || strchr (file, ':') != NULL)
  2616. #endif
  2617.         return ( (fd = devopen (file, "r")) >= 0 ?
  2618.                 fdopen(fd, "r") :
  2619.                 NULL);
  2620.  
  2621.     do {
  2622.         trypath[0] = '\0';
  2623.         /* this should take into account limits on size of trypath */
  2624.         for (cp = trypath; *awkpath && *awkpath != ENVSEP; )
  2625.             *cp++ = *awkpath++;
  2626.  
  2627.         if (cp != trypath) {    /* nun-null element in path */
  2628.             *cp++ = '/';
  2629.             strcpy (cp, file);
  2630.         } else
  2631.             strcpy (trypath, file);
  2632. #ifdef DEBUG
  2633.         if (debugging)
  2634.             fprintf(stderr, "trying: %s\n", trypath);
  2635. #endif
  2636.         if ((fd = devopen (trypath, "r")) >= 0
  2637.             && (fp = fdopen(fd, "r")) != NULL)
  2638.             return (fp);
  2639.  
  2640.         /* no luck, keep going */
  2641.         if(*awkpath == ENVSEP && awkpath[1] != '\0')
  2642.             awkpath++;    /* skip colon */
  2643.     } while (*awkpath);
  2644. #ifdef MSDOS
  2645.     /*
  2646.      * Under DOS (and probably elsewhere) you might have one of the awk
  2647.      * paths defined, WITHOUT the current working directory in it.
  2648.      * Therefore you should try to open the file in the current directory.
  2649.      */
  2650.     return ( (fd = devopen(file, "r")) >= 0 ? fdopen(fd, "r") : NULL);
  2651. #else
  2652.     return (NULL);
  2653. #endif
  2654. }
  2655.  
  2656. static NODE *
  2657. node_common(op)
  2658. NODETYPE op;
  2659. {
  2660.     register NODE *r;
  2661.     extern int numfiles;
  2662.     extern int tempsource;
  2663.     extern char **sourcefile;
  2664.  
  2665.     r = newnode(op);
  2666.     r->source_line = lineno;
  2667.     if (numfiles > -1 && ! tempsource)
  2668.         r->source_file = sourcefile[curinfile];
  2669.     else
  2670.         r->source_file = NULL;
  2671.     return r;
  2672. }
  2673.  
  2674. /*
  2675.  * This allocates a node with defined lnode and rnode. 
  2676.  * This should only be used by yyparse+co while reading in the program 
  2677.  */
  2678. NODE *
  2679. node(left, op, right)
  2680. NODE *left, *right;
  2681. NODETYPE op;
  2682. {
  2683.     register NODE *r;
  2684.  
  2685.     r = node_common(op);
  2686.     r->lnode = left;
  2687.     r->rnode = right;
  2688.     return r;
  2689. }
  2690.  
  2691. /*
  2692.  * This allocates a node with defined subnode and proc
  2693.  * Otherwise like node()
  2694.  */
  2695. static NODE *
  2696. snode(subn, op, procp)
  2697. NODETYPE op;
  2698. NODE *(*procp) ();
  2699. NODE *subn;
  2700. {
  2701.     register NODE *r;
  2702.  
  2703.     r = node_common(op);
  2704.     r->subnode = subn;
  2705.     r->proc = procp;
  2706.     return r;
  2707. }
  2708.  
  2709. /*
  2710.  * This allocates a Node_line_range node with defined condpair and
  2711.  * zeroes the trigger word to avoid the temptation of assuming that calling
  2712.  * 'node( foo, Node_line_range, 0)' will properly initialize 'triggered'. 
  2713.  */
  2714. /* Otherwise like node() */
  2715. static NODE *
  2716. mkrangenode(cpair)
  2717. NODE *cpair;
  2718. {
  2719.     register NODE *r;
  2720.  
  2721.     r = newnode(Node_line_range);
  2722.     r->condpair = cpair;
  2723.     r->triggered = 0;
  2724.     return r;
  2725. }
  2726.  
  2727. /* Build a for loop */
  2728. static NODE *
  2729. make_for_loop(init, cond, incr)
  2730. NODE *init, *cond, *incr;
  2731. {
  2732.     register FOR_LOOP_HEADER *r;
  2733.     NODE *n;
  2734.  
  2735.     emalloc(r, FOR_LOOP_HEADER *, sizeof(FOR_LOOP_HEADER), "make_for_loop");
  2736.     n = newnode(Node_illegal);
  2737.     r->init = init;
  2738.     r->cond = cond;
  2739.     r->incr = incr;
  2740.     n->sub.nodep.r.hd = r;
  2741.     return n;
  2742. }
  2743.  
  2744. /*
  2745.  * Install a name in the hash table specified, even if it is already there.
  2746.  * Name stops with first non alphanumeric. Caller must check against
  2747.  * redefinition if that is desired. 
  2748.  */
  2749. NODE *
  2750. install(table, name, value)
  2751. NODE **table;
  2752. char *name;
  2753. NODE *value;
  2754. {
  2755.     register NODE *hp;
  2756.     register int len, bucket;
  2757.     register char *p;
  2758.  
  2759.     len = 0;
  2760.     p = name;
  2761.     while (is_identchar(*p))
  2762.         p++;
  2763.     len = p - name;
  2764.  
  2765.     hp = newnode(Node_hashnode);
  2766.     bucket = hashf(name, len, HASHSIZE);
  2767.     hp->hnext = table[bucket];
  2768.     table[bucket] = hp;
  2769.     hp->hlength = len;
  2770.     hp->hvalue = value;
  2771.     emalloc(hp->hname, char *, len + 1, "install");
  2772.     memcpy(hp->hname, name, len);
  2773.     hp->hname[len] = '\0';
  2774.     return hp->hvalue;
  2775. }
  2776.  
  2777. /*
  2778.  * find the most recent hash node for name name (ending with first
  2779.  * non-identifier char) installed by install 
  2780.  */
  2781. NODE *
  2782. lookup(table, name)
  2783. NODE **table;
  2784. char *name;
  2785. {
  2786.     register char *bp;
  2787.     register NODE *bucket;
  2788.     register int len;
  2789.  
  2790.     for (bp = name; is_identchar(*bp); bp++)
  2791.         ;
  2792.     len = bp - name;
  2793.     bucket = table[hashf(name, len, HASHSIZE)];
  2794.     while (bucket) {
  2795.         if (bucket->hlength == len && STREQN(bucket->hname, name, len))
  2796.             return bucket->hvalue;
  2797.         bucket = bucket->hnext;
  2798.     }
  2799.     return NULL;
  2800. }
  2801.  
  2802. #define HASHSTEP(old, c) ((old << 1) + c)
  2803. #define MAKE_POS(v) (v & ~0x80000000)    /* make number positive */
  2804.  
  2805. /*
  2806.  * return hash function on name.
  2807.  */
  2808. static int
  2809. hashf(name, len, hashsize)
  2810. register char *name;
  2811. register int len;
  2812. int hashsize;
  2813. {
  2814.     register int r = 0;
  2815.  
  2816.     while (len--)
  2817.         r = HASHSTEP(r, *name++);
  2818.  
  2819.     r = MAKE_POS(r) % hashsize;
  2820.     return r;
  2821. }
  2822.  
  2823. /*
  2824.  * Add new to the rightmost branch of LIST.  This uses n^2 time, so we make
  2825.  * a simple attempt at optimizing it.
  2826.  */
  2827. static NODE *
  2828. append_right(list, new)
  2829. NODE *list, *new;
  2830.  
  2831. {
  2832.     register NODE *oldlist;
  2833.     static NODE *savefront = NULL, *savetail = NULL;
  2834.  
  2835.     oldlist = list;
  2836.     if (savefront == oldlist) {
  2837.         savetail = savetail->rnode = new;
  2838.         return oldlist;
  2839.     } else
  2840.         savefront = oldlist;
  2841.     while (list->rnode != NULL)
  2842.         list = list->rnode;
  2843.     savetail = list->rnode = new;
  2844.     return oldlist;
  2845. }
  2846.  
  2847. /*
  2848.  * check if name is already installed;  if so, it had better have Null value,
  2849.  * in which case def is added as the value. Otherwise, install name with def
  2850.  * as value. 
  2851.  */
  2852. static void
  2853. func_install(params, def)
  2854. NODE *params;
  2855. NODE *def;
  2856. {
  2857.     NODE *r;
  2858.  
  2859.     pop_params(params->rnode);
  2860.     pop_var(params, 0);
  2861.     r = lookup(variables, params->param);
  2862.     if (r != NULL) {
  2863.         fatal("function name `%s' previously defined", params->param);
  2864.     } else
  2865.         (void) install(variables, params->param,
  2866.             node(params, Node_func, def));
  2867. }
  2868.  
  2869. static void
  2870. pop_var(np, freeit)
  2871. NODE *np;
  2872. int freeit;
  2873. {
  2874.     register char *bp;
  2875.     register NODE *bucket, **save;
  2876.     register int len;
  2877.     char *name;
  2878.  
  2879.     name = np->param;
  2880.     for (bp = name; is_identchar(*bp); bp++)
  2881.         ;
  2882.     len = bp - name;
  2883.     save = &(variables[hashf(name, len, HASHSIZE)]);
  2884.     for (bucket = *save; bucket; bucket = bucket->hnext) {
  2885.         if (len == bucket->hlength && STREQN(bucket->hname, name, len)) {
  2886.             *save = bucket->hnext;
  2887.             freenode(bucket);
  2888.             free(bucket->hname);
  2889.             if (freeit)
  2890.                 free(np->param);
  2891.             return;
  2892.         }
  2893.         save = &(bucket->hnext);
  2894.     }
  2895. }
  2896.  
  2897. static void
  2898. pop_params(params)
  2899. NODE *params;
  2900. {
  2901.     register NODE *np;
  2902.  
  2903.     for (np = params; np != NULL; np = np->rnode)
  2904.         pop_var(np, 1);
  2905. }
  2906.  
  2907. static NODE *
  2908. make_param(name)
  2909. char *name;
  2910. {
  2911.     NODE *r;
  2912.  
  2913.     r = newnode(Node_param_list);
  2914.     r->param = name;
  2915.     r->rnode = NULL;
  2916.     r->param_cnt = param_counter++;
  2917.     return (install(variables, name, r));
  2918. }
  2919.  
  2920. /* Name points to a variable name.  Make sure its in the symbol table */
  2921. NODE *
  2922. variable(name)
  2923. char *name;
  2924. {
  2925.     register NODE *r;
  2926.  
  2927.     if ((r = lookup(variables, name)) == NULL)
  2928.         r = install(variables, name,
  2929.             node(Nnull_string, Node_var, (NODE *) NULL));
  2930.     return r;
  2931. }
  2932.